15

这是代码:

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 像素的边框。可能是什么原因造成的,我该如何解决?

编辑:我没有在任何地方使用任何绿色,所以这一定是来自框架。

4

5 回答 5

22

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

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

于 2014-04-17T09:20:18.323 回答
18

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

floor(width / 16) * 16

或者

ceil(width / 16) * 16

取决于您对宽度更小或更大的偏好

于 2017-07-10T13:57:05.887 回答
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)

其中mainCompositionWidthmainCompositionHeightCGFloat,计算如下:

 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

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

于 2016-07-04T06:37:03.847 回答
4

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

于 2014-04-05T18:43:35.247 回答
2

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

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

while (computedVideoSize%16>0) { // find the right resolution that can be divided by 16
    computedVideoSize++;
}
于 2015-06-09T14:17:40.950 回答