0

我正在使用 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 中(我把它做成了一个“音乐视频”,这样它就可以正确显示并可以导出到我的手机库中)。然后我同步并将其发送到我的设备进行测试。

在应用程序中,视频在媒体选择器中显示良好,我可以将其导出,并且看不到任何错误。但是,当我在应用程序中播放它时,它只播放视频而不播放音频。我从其他来源导入的其他视频可以很好地播放视频的音频,所以我不“认为”它是播放器本身。

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

4

1 回答 1

1

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

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

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

于 2013-03-28T21:12:09.603 回答