为什么MPMoviePlayerViewController在技术上应该能够播放的电影上失败?

时间:2011-02-15 01:16:36

标签: iphone objective-c media-player

我正在支持Range请求的服务器上初始化MPMoviePlayerViewController到源.mp4以及所有这些,实际上我正在使用的代码在运行iOS的iPhone 4,iPhone 3GS和iPad上正常工作4。

我有一台运行iOS 4的iPhone 3G。此设备上的电影播放器​​类开始流式传输,然后立即完成播放。但它没有错误,它只是通过打印MPMoviePlaybackDidFinishNotification来完成回放;它返回MPMoviePlayerPlaybackDidFinishReasonUserInfoKey = 0,我认为这是MPMovieFinishReasonPlaybackEnded,因为它是枚举的第一个值。我甚至尝试过设置播放提示MPMovieSourceType = MPMovieSourceTypeStreaming

问题是,如果我在iPhone 3G上导航到Safari中的非常相同的URL ,它会流式传输并播放电影而不会出错。我完全难过了,到目前为止谷歌还没有发现3G的具体内容。可能的解决方案包括创建自定义AVFoundation实施(完全不理想)或在3G设备上使用MPMoviePlayerController。如果某人有基于iPhone型号的切换指导,而不是iOS版本的运行,那就太棒了。

使用CFNotificationObserver回调注册,我收到了以下感兴趣的通知:

Name: AVFileValidatorNotification_NotPlayable <-- likely the source of the issue
Info: Error = "Error
               Domain=NSOSStatusErrorDomain
               Code=-12621
               \"This movie could not be played.\" "

Name: FailedToBecomeReadyForInspection
Info: Properties = ( InitialSamples );
      Result = "-12621";

Name: AVController_ItemFailedToPlay
Info: "AVController_Error" = (the above Error object);
      "AVController_Item" = "<MPAVItem: 0x1b65d0>";

Name: MPAvControllerPlaybackStateChangedNotification
// Got several of these, the playback state changed as follows: 0 -> 2 -> 7 -> 0

2 个答案:

答案 0 :(得分:3)

调试视频播放很棘手。如果添加通用通知观察器,您可以看到更多幕后发生的事情:

CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), NULL, &someCallback, NULL, NULL, CFNotificationSuspensionBehaviorDeliverImmediately);

使用someCallback()

void someCallBack(
    CFNotificationCenterRef center,
    void *observer,
    CFStringRef name,
    const void *object,
    CFDictionaryRef userInfo
);

注意我在这里使用了CFNotificationCenter而不是NSNotificationCenter。传递的一些通知在其参数中使用指针,这些指针无法强制转换为id,因此当通过Cocoa添加全局观察器时,它们会导致崩溃。这在核心基础级别不是问题,为此目的使用垃圾指针是合法的。

编辑:根据您所获得的错误 - 视频对于3G上的解码器芯片可能过于高质量(Safari可能会使用不同的解码路径,从而提供更大的灵活性在其播放支持中。)较新的设备支持更高质量的H.264视频,而较旧的设备的格式有限。视频的分辨率和H.264配置文件是什么?

此外,如果视频直接安装在设备上,它会播放吗?

答案 1 :(得分:1)

这是如何解决的:它现在“正常”。改变了什么?我更改了应用程序的Bundle ID,我在其他地方做了几个界面调整,但实际的演示或电影播放器​​对象的设置都没有改变。我还没有重启手机;我确实用旧的Bundle ID删除了应用程序。

我不是特别高兴它随机修复自己,特别是如果重新安装应用程序就完成了。这意味着如果安装以与我本来相同的方式“损坏”,一些最终用户可能会遇到同样的问题。