在使用AVFoundation处理视频的时候,裁剪结束导出的文件有时候会在视频的右侧或者底部出现一个像素左右的绿色边框,比如下面图片的右边,就是箭头指出的那个边框,并且是偶现的,之前一直没有注意,今天把他解决了。
解决方案
就是把要生成的视频的宽和高都要能把16整除。
举个例子:
比如说原视频是1280*900
的,当你指定宽高,生成一个720*720
的视频的话,是没问题的,但是比如要生成一个高为720,宽度自适应的时候,如果宽度简单的计算为720*900/1280
的话,结果是506,就是生成的720*506
的视频,这样的视频肯定是有绿边的,解决方案就是宽度可以循环找到能整除16的宽度,这样算的话生成的视频的比例就是为720*512
,这样生成的视频才是没有绿边的。
float heightScale = self.videoHeight/720.0;
float widthScale = self.videoWidth/720.0;
float scale = MAX(heightScale, widthScale);
CGSize cropSize;
if (scale == heightScale) {
//高为720
while (((int)(self.videoWidth/scale))%16>0) {
self.videoWidth++;
}
int width = (int)self.videoWidth/scale;
cropSize = CGSizeMake(width, 720);
}
当然也可以使用下面的函数找到
floor(width / 16) * 16
//或者
ceil(width / 16) * 16
这样解决之后重新用同一个视频就发现没有绿边了。
产生原因
原因是因为使用MPEG-2和MPEG-4(和其他基于DCT的编解码器),压缩被应用于16×16像素宏块的网格。使用MPEG-4第10部分(AVC / H.264),4和8的倍数也是有效的,但16是最有效的。
如果水平或垂直尺寸不能被16整除,那么编码器在右边缘或下边缘用合适数量的黑色”悬垂“样本贴图,这些样本在解码时被丢弃。例如,当在1920x1080编码HDTV时,编码器将8行黑色像素附加到h e eimage阵列,使行数为1088。如果播放器/编解码器在解码时丢弃那些“悬垂”样本,可能会出现我所说的绿线。
参考文章
在此感谢以下链接之前给出的解决方案,谢谢
- AVAssetExportSession giving me a green border on right and bottom of output video
- Annoying Green Line
- Divisible by 16 - the magic number!
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/586.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!