AVAssetExportSession在输出视频的右下角给我一个绿色边框

时间:2014-04-05 16:24:23

标签: ios avfoundation avassetexportsession avmutablecomposition avasset

以下是代码:

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像素的边框。可能导致这种情况的原因以及如何解决?

编辑:我没有在任何地方使用任何绿色,所以这必须以某种方式来自框架。

5 个答案:

答案 0 :(得分:14)

通常在视频裁剪后出现绿线,问题出在视频renderSize宽度,它应该是16的乘法。

这里有一些关于此的链接: apple 1 apple 2

答案 1 :(得分:11)

获得16的倍数的更好的解决方案是这种方法:

floor(width / 16) * 16

ceil(width / 16) * 16

取决于您对宽度越来越小的偏好

答案 2 :(得分:6)

这为我带来了魔力(iOS9,Swift 3,iPhone 6):

基于: https://www.raywenderlich.com/94404/play-record-merge-videos-ios-swift

mainComposition.renderSize 更改为:

mainComposition.renderSize = CGSize(width: self.mainCompositionWidth, height: self.mainCompositionHeight)

其中 mainCompositionWidth mainCompositionHeight CGFloat ,并且计算如下:

 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
    }

同时将 videoCompositionInstructionForTrack 功能中的 scaleFitRatio 修改为:

scaleToFitRatio = self.mainCompositionWidth / assetTrack.naturalSize.height

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

为了获得正确的分辨率,请尝试这样的事情......将其递增,直到最接近的数字可以除以16:

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

while (computedVideoSize%16>0) { // find the right resolution that can be divided by 16
    computedVideoSize++;
}