为什么AVAssetExportSession会生成一个空文件?

zak*_*ces 4 video objective-c avfoundation ios avassetexportsession

我正在尝试从UIImagePickerController创建的源视频中导出.mov文件.问题是输出文件AVAssetExportSession创建的只有668个字节.它为什么失败?我的代码:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSURL *imagePickerVideoURL = [info objectForKey:UIImagePickerControllerMediaURL];
    NSString *filename = @"vid1.mov";

    AVAsset *video = [AVAsset assetWithURL:imagePickerVideoURL];
    AVAssetExportSession *exportSession
      = [AVAssetExportSession exportSessionWithAsset:video presetName:AVAssetExportPresetMediumQuality];
    exportSession.shouldOptimizeForNetworkUse = YES;
    exportSession.outputFileType = AVFileTypeQuickTimeMovie;
    exportSession.outputURL = [pathToSavedVideosDirectory URLByAppendingPathComponent:filename];
    NSLog(@"processing video...: %@", exportSession);
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
                       NSLog(@"done processing video!");
                   }];
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*pia 5

我猜它是因为exportSession没有保留在内存中,因此在didFinishPickingMediaWithInfo完成之后(在导出会话完成处理程序运行之前)被杀死.

存储exportSession@property或更改完成处理程序以复制引用,exportSession如下所示:

[exportSession exportAsynchronouslyWithCompletionHandler:^{
       if (AVAssetExportSessionStatusCompleted == exportSession.status)
       {
           NSLog(@"done processing video!");
       }
}];
Run Code Online (Sandbox Code Playgroud)


小智 1

exportSession 有一个“error”属性,您可以检查该属性以确定错误是什么。很多时候,这些错误并不是特别有帮助,但它至少是一个起点。

请注意,我发现 .mov 文件存在问题,其中的编解码器不受 AVFoundation 支持。