从MPMediaPickerController导出视频 - 没有音频

时间:2013-03-04 00:28:58

标签: iphone ios objective-c avassetexportsession mpmediapickercontroller

我正在使用MPMediaPickerController来允许用户从设备上的库中选择视频和歌曲。我允许使用:initWithMediaTypes:MPMediaTypeAny初始化选择器。然后,用户可以在导出之后在应用内播放歌曲或视频。这是我的电影导出代码,将其剥离为其核心功能:

- (void)mediaPicker:(MPMediaPickerController*)mediaPicker didPickMediaItems:(MPMediaItemCollection*)mediaItemCollection {
    AVAssetExportSession *exportSession;
    NSString *filePath;
    NSURL *fileUrl;

    for (MPMediaItem *item in mediaItemCollection.items) {
        NSURL *assetUrl = [item valueForProperty:MPMediaItemPropertyAssetURL];
        AVAsset *currAsset = [AVAsset assetWithURL:assetUrl];
        exportSession = [[AVAssetExportSession alloc] initWithAsset:[AVAsset assetWithURL:assetUrl] presetName:AVAssetExportPresetHighestQuality];
        exportSession.shouldOptimizeForNetworkUse = YES;
        exportSession.outputFileType = AVFileTypeQuickTimeMovie;
        filePath = [title stringByAppendingString:@".mov"];
        fileUrl = [NSURL fileURLWithPath:[[NSFileManager documentDirectory] stringByAppendingPathComponent:filePath]];

        exportSession.outputURL = fileUrl;
        dispatch_group_enter(dispatchGroup);

        [exportSession exportAsynchronouslyWithCompletionHandler:^{
            // success
        }
        dispatch_group_leave(dispatchGroup);
    }];
    }

此类似代码适用于录制音频,但对于视频,视频的音频无法播放。来自iTunes的大多数内容都受到保护且无法导出,因此我想使用我用iPhone拍摄的自制快速视频进行测试。我拍摄了视频,将其拖入iTunes(我将其设为“音乐视频”,以便它正确显示并可以导出到我手机的库中)。然后我同步并将其发送到我的设备进行测试。

在应用程序中,视频在媒体选择器中显示正常,我可以导出它而没有我能看到的错误。但是,当我在应用程序中播放它时,它只播放视频而不播放音频。我从其他来源导入的其他视频可以很好地播放视频的音频,所以我不认为这是播放器本身。

在这里我可能会遗漏一些关于为什么音频不会从媒体选择器的这种导出中传出来的东西?提前感谢您对此问题的任何帮助!

1 个答案:

答案 0 :(得分:1)

不确定这是否是理想的解决方案,但我们发现这个问题的唯一方法是将其更改为强制使用PresetPassthrough设置的m4v格式。即:

exportSession = [[AVAssetExportSession alloc] initWithAsset:[AVAsset assetWithURL:assetUrl] presetName:AVAssetExportPresetPassthrough];
exportSession.shouldOptimizeForNetworkUse = YES;
exportSession.outputFileType = AVFileTypeAppleM4V;
filePath = [title stringByAppendingString:@".m4v"];

在进行此项更改后,音频和视频似乎适用于以这种方式导入的视频。