ios - 为什么不应用 AVMutableVideoCompositionInstruction?

标签 ios video avfoundation

我正在使用 AVAssetExportSession 将多个视频记录连接成一个条目。

由于用户可以在录制期间在前置和后置摄像头之间切换,因此录制的方向会切换,如果录制包含一个使用前向摄像头的剪辑和第二个使用后置摄像头的剪辑,则连接的视频将显示第一个剪辑使用预期方向,第二个剪辑倒置(反之亦然)。

我知道我需要在导出器上设置 videoComposition 指令,但我对将任何旋转应用到导出的视频并不满意。

在下面的例子中,我设置了一个 90 度的虚拟旋转变换,只是为了尝试强制全面改变,但我导出的视频不受影响。 . .我猜我遗漏了一些明显的东西,但我看不到什么,有人能看出我的错误吗?

    AVMutableComposition *composition = [AVMutableComposition composition];
    AVAssetExportSession *assetExport = [AVAssetExportSession exportSessionWithAsset:composition presetName:AVAssetExportPresetPassthrough];
    NSMutableArray *instructions = [NSMutableArray new];

    AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    CGAffineTransform transformToApply=CGAffineTransformMakeRotation(90.0);

    for (NSURL *path in filePaths) {
        NSLog(@"%@", path);
        AVURLAsset *asset =[AVURLAsset assetWithURL:path];

        CMTime atTime = composition.duration;
        [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration)
                                       ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]
                                        atTime:atTime error:&error];

        AVMutableVideoCompositionLayerInstruction *layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]];
        [layerInstruction setTransform:transformToApply atTime:kCMTimeZero];            
        AVMutableVideoCompositionInstruction * videoTrackInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
        videoTrackInstruction.timeRange = CMTimeRangeMake(atTime, asset.duration);
        videoTrackInstruction.layerInstructions = [NSArray arrayWithObject:layerInstruction];
        [instructions addObject:videoTrackInstruction];

        [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration)
                                       ofTrack:[[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
                                        atTime:atTime error:&error];
    }
    AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
    videoComposition.instructions = instructions;
    videoComposition.frameDuration = CMTimeMake(1, compositionVideoTrack.naturalTimeScale);
    videoComposition.renderSize = compositionVideoTrack.naturalSize;
    assetExport.videoComposition = videoComposition;

最佳答案

关于ios - 为什么不应用 AVMutableVideoCompositionInstruction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14830148/

相关文章:

ios - 从collectionView中获取indexpath,有时会获取错误的indexPath

iphone - 在 iOS 上处理视频时跳过帧

c# - 如何在 C# 中更改 WMV 文件的分辨率

ios - 如何在 AVMutableComposition 中组合纵向和横向资源进行预览

ios - 如何将不相关的数组添加到 iOS-charts 折线图中的数据点标签?

ios - 核心数据的 Collection View - 最后选择的内容首先出现

wpf - 通过 directx 或其他方法在 WPF 应用程序中实时 1394 火线视频

android - 如何在Android中使用mediastore.audio获取具有音频文件的目录的名称

ios - 如何使用 AVFoundation 将图像捕获到文档目录

avfoundation - 如何使用 AVFoundation 从视频流中获取原始格式的图像缓冲区?