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 compositionwidth,main compositionheight为CGFloats,计算如下:
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