SDAVAssetExportSession

SDAVAssetExportSession

尝试使用SDAVAssetExportSession和readme中的示例将MOV重新编码为MP4时,后置摄像头设备在左右边框,而前置摄像头则为正方形裁剪。

无需任何重新编码,我的播放器(使用AVLayerVideoGravityResizeAspectFill的PBJVideoPlayerController)可以正确显示全屏视频。

我猜SDAVAssetExportSession的renderSize出了点问题,但我真的不明白为什么其他人似乎都没有问题。

这是重新编码后的前后摄像头的屏幕截图:

无需重新编码的视频屏幕快照,后置摄像头(完全全屏):
ios - 奇怪的种植行为-LMLPHP

带有后编码的视频截图,后置摄像头:
ios - 奇怪的种植行为-LMLPHP

带前置摄像头的重新编码视频的屏幕截图
ios - 奇怪的种植行为-LMLPHP

如您所见,播放器不应该成为问题,因为不用重新编码就可以了。但是在导出后,边框出现在后面,我不知道真的知道前置摄像头会发生什么...

有什么帮助吗?

谢谢 !

PS:喜欢我的咖啡杯吗?

最佳答案

我也正在使用SDAVAssetExportSession,并且我意识到,如果您给肖像视频提供的宽度大于高度,并且偏离其所需的宽高比,则会发生不好的视频裁剪。如果横向视频的高度大于宽度,则会发生同样的情况。

我的解决方案是在转码之前先获取视频的宽高比和当前尺寸,然后根据其当前尺寸计算出较小的宽度和高度,以保持宽高比。这样可以防止产生的视频带有黑色边框。

更新:这是相关代码-

这显示了如何调整尺寸并保持长宽比并避免裁切问题。注意,widthheight是由用户控制的整数变量。如果未提供,我将使用原始视频的宽度和高度进行转码。

AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:assetPath] options:nil];

NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *outputPath = [NSString stringWithFormat:@"%@/%@%@", cacheDir, videoFileName, outputExtension];
NSURL *outputURL = [NSURL fileURLWithPath:outputPath];

NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeVideo];
AVAssetTrack *track = [tracks objectAtIndex:0];
CGSize mediaSize = track.naturalSize;

float videoWidth = mediaSize.width;
float videoHeight = mediaSize.height;
float aspectRatio = videoWidth / videoHeight;
int newWidth = (width && height) ? height * aspectRatio : videoWidth;
int newHeight = (width && height) ? newWidth / aspectRatio : videoHeight;

NSLog(@"input videoWidth: %f", videoWidth);
NSLog(@"input videoHeight: %f", videoHeight);
NSLog(@"output newWidth: %d", newWidth);
NSLog(@"output newHeight: %d", newHeight);

SDAVAssetExportSession *encoder = [SDAVAssetExportSession.alloc initWithAsset:avAsset];
encoder.outputFileType = stringOutputFileType;
encoder.outputURL = outputURL;
encoder.videoSettings = @
{
    AVVideoCodecKey: AVVideoCodecH264,
    AVVideoWidthKey: [NSNumber numberWithInt: newWidth],
    AVVideoHeightKey: [NSNumber numberWithInt: newHeight],
    AVVideoCompressionPropertiesKey: @
    {
        AVVideoAverageBitRateKey: [NSNumber numberWithInt: videoBitRate],
        AVVideoProfileLevelKey: AVVideoProfileLevelH264High40
    },
};

08-18 14:18