是否可以使用 AVAssetWriter 完全裁剪视频?

Posted

技术标签:

【中文标题】是否可以使用 AVAssetWriter 完全裁剪视频?【英文标题】:Is it possible fully crop a video with AVAssetWriter? 【发布时间】:2021-04-27 08:39:50 【问题描述】:

我正在使用 AVAssetWriter 创建一个视频文件,我想裁剪它并找到了AVVideoCleanApertureKey 的键。这让我可以为视频设置一个视口,看起来就像是在裁剪视频。但实际上并非如此,全帧仍然存在于视频文件中,是否使用“裁剪”似乎取决于视图播放器。

那么,有没有办法使用 AVAssetWriter 丢弃视口周围的“外部”数据?还是我需要完全改变我的方法。

这些图像显示相同的视频文件,但只有 QuickTime 关心视口。

【问题讨论】:

【参考方案1】:

我相信这个问题的直接答案是否定的。所以最后我切换到AVMutableVideoCompositionAVAssetExportSession 作为网络上其他答案的建议。

    AVAsset *video = [AVAsset assetWithURL:outputURL];
    AVAssetTrack *assetVideoTrack = [[video tracksWithMediaType:AVMediaTypeVideo] lastObject];
    AVMutableVideoCompositionLayerInstruction *layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:assetVideoTrack];
    CGAffineTransform transform = CGAffineTransformMakeTranslation(-self.rect.origin.x, -self.rect.origin.y);
    [layerInstruction setTransform:transform atTime:kCMTimeZero];
    AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
    instruction.layerInstructions = @[layerInstruction];
    instruction.timeRange = assetVideoTrack.timeRange;
    AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
    
    // https://***.com/questions/22883525/avassetexportsession-giving-me-a-green-border-on-right-and-bottom-of-output-vide
    videoComposition.renderSize = CGSizeMake(floor(self.rect.size.width / 16) * 16, 
                                             floor(self.rect.size.height / 16) * 16);
    videoComposition.renderScale = 1.0;
    
    videoComposition.frameDuration = CMTimeMake(1, 30);
    videoComposition.instructions = @[instruction];
    AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:video presetName:AVAssetExportPreset1280x720];
    exportSession.shouldOptimizeForNetworkUse = NO;
    exportSession.outputFileType = AVFileTypeMPEG4;
    exportSession.videoComposition = videoComposition;
    exportSession.outputURL = outputURL2;

    [exportSession exportAsynchronouslyWithCompletionHandler:^ 
        NSLog(@"done processing video!");
    ];

【讨论】:

以上是关于是否可以使用 AVAssetWriter 完全裁剪视频?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVAssetWriter 和 CoreML 的相机上的 FPS 不一致

AVAssetWriter 元数据日期问题

AVAssetWriter视频数据编码

AVAssetWriter 未知错误

如何使用 AVAssetReader 和 AVAssetWriter 创建 AAC 文件?

使用 AVCaptureSession 和 AVAssetWriter 在翻转相机时无缝录制音频