我正在支持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
答案 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删除了应用程序。
我不是特别高兴它随机修复自己,特别是如果重新安装应用程序就完成了。这意味着如果安装以与我本来相同的方式“损坏”,一些最终用户可能会遇到同样的问题。