Ios AVAssetExportSession在输出视频的右侧和底部提供绿色边框

Ios AVAssetExportSession在输出视频的右侧和底部提供绿色边框,ios,avfoundation,avassetexportsession,avmutablecomposition,avasset,Ios,Avfoundation,Avassetexportsession,Avmutablecomposition,Avasset,代码如下: AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality]; exporter.outputURL = outputUrl; exporter.outputFileType = AVFileTypeQuickTimeMovie;

代码如下:

AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
        exporter.outputURL = outputUrl;
        exporter.outputFileType = AVFileTypeQuickTimeMovie;
        exporter.videoComposition = mainComposition;
        exporter.shouldOptimizeForNetworkUse = YES;
        [exporter exportAsynchronouslyWithCompletionHandler:^{
            //completion
        }];
我尝试过不同的质量设置。我总是得到一个1-2像素的边框,沿着视频的右侧和底部,无论我试图渲染什么视频。是什么原因造成的?我该如何修复


编辑:我没有在任何地方使用任何类型的绿色,因此这一定是来自框架的某种原因。

结果表明,如果AVMutableVideoComposition的渲染大小宽度不是偶数,则会得到神秘的绿色边框。好时光。

通常在视频剪切后出现绿线,问题在于视频渲染宽度,应该是16的倍数

这里有一些关于这个的链接:

为了获得正确的分辨率,请尝试以下方法。。。递增,直到最接近的数字可以除以16:

computedVideoSize=self.view.frame.size.width;

while (computedVideoSize%16>0) { // find the right resolution that can be divided by 16
    computedVideoSize++;
}
这为我带来了魔力(iOS9、Swift 3、iPhone 6):

基于:

main合成。渲染化为:

mainComposition.renderSize = CGSize(width: self.mainCompositionWidth, height: self.mainCompositionHeight)
其中,main compositionwidthmain compositionheightCGFloats,计算如下:

 self.mainCompositionWidth = UIScreen.mainScreen().bounds.width
    self.mainCompositionHeight = UIScreen.mainScreen().bounds.height

    while (self.mainCompositionWidth%16>0) { // find the right resolution that can be divided by 16
        self.mainCompositionWidth = self.mainCompositionWidth + 1.0
    }

    while (self.mainCompositionHeight%16>0) { // find the right resolution that can be divided by 16
        self.mainCompositionHeight = self.mainCompositionHeight + 1.0
    }
还可以将视频合成说明fortrack功能中的缩放过滤修改为:

scaleToFitRatio = self.mainCompositionWidth / assetTrack.naturalSize.height

这使得底部的绿线消失,视频填满屏幕。

获得16的倍数的更好解决方案是以下方法:

floor(width / 16) * 16


根据您的喜好,对于我来说,宽度越小或越大

只要确保视频的宽度均匀就可以了(我测试的数字不是4、8或16的倍数)
ceil(width / 16) * 16