【问题标题】:MPMoviePlayerController can't play local file with error _itemFailedToPlayToEndMPMoviePlayerController 无法播放本地文件并出现错误 _itemFailedToPlayToEnd
【发布时间】:2014-04-22 07:33:51
【问题描述】:

我有一个我想要的本地 iPhone 兼容 MP4 视频(我已经为 iPhone 转换了视频,并且我已经测试了将视频上传到网络服务器并将其 URL 输入到移动 Safari 中,它可以完美播放)使用MPMoviePlayerController播放。

这是我的代码:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Welcome" ofType:@"mp4"];
NSURL *fileURL = [NSURL URLWithString:filePath];
playerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];
playerController.movieSourceType = MPMovieSourceTypeFile;
playerController.backgroundView.backgroundColor = [UIColor whiteColor];

playerController.view.translatesAutoresizingMaskIntoConstraints = YES;
playerController.scalingMode = MPMovieScalingModeAspectFill;
//[playerController.view setFrame:moviePlayerContainerView.frame];
[playerController.view setFrame:CGRectMake(0, 0, 200, 200)];
[moviePlayerContainerView addSubview:playerController.view];
playerController.contentURL = fileURL;
playerController.fullscreen = YES;
[playerController prepareToPlay];
[playerController play];

fileURL 指向一个有效的文件:

(lldb) po fileURL
/var/mobile/Applications/73C97CC9-731E-4446-A53C-2A8CA30A2393/Tanisalim.app/Welcome.mp4
(lldb) p (BOOL)[[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:NO]
(BOOL) $0 = YES

当我尝试在模拟器(6.1 和 7.1)上运行时,它只会在框架中显示黑屏(如果全屏为 NO)或打开电影播放器​​视图控制器并永远保持“正在加载...”。当我在设备(iOS 7.1)上运行时,行为是相同的,但我在控制台上收到此错误:

_itemFailedToPlayToEnd: {
    kind = 1;
    new = 2;
    old = 0;
}

当我尝试加载完全相同的视频文件以直接从网络流式传输时,它可以完美运行:

//playerController.contentURL = fileURL;
playerController.contentURL = [NSURL URLWithString:@"http://mywebsite.com/Welcome.mp4"];

我尝试了不同的视频文件,但结果是一样的。我做错了什么?

【问题讨论】:

    标签: ios mpmovieplayercontroller


    【解决方案1】:

    我遇到了完全相同的问题,但在我的情况下它是多层次的。

    • 确保您使用-fileURLWithPath: 而不是-URLWithString: 来创建您的网址,正如@tagy22 所述。似乎这对许多人来说都可以,但是我已经在使用文件 URL,所以缺少一些东西。
    • 确保您的本地文件具有扩展名(例如“.mp4”)。 MPMoviePlayerController 不喜欢没有扩展名的文件。如果您需要存储没有扩展名的文件,一个解决方案是创建一个指向实际文件的临时符号链接,并为 MPMoviePlayerController 提供指向该符号链接的文件 URL,而不是“真实”文件。
    • 您的符号链接应该位于 iOS Caches 目录 (~/Library/Caches) 中的某个位置,否则它可能不起作用。我试图让MPMoviePlayerController 播放临时目录中的符号链接,它在模拟器中有效,但在我的设备上不能。

    创建指向实际视频文件的符号链接

    NSError *error;
    NSFileManager *manager = [NSFileManager defaultManager];
    [manager createSymbolicLinkAtURL:linkPath withDestinationURL:actualFilePath error:&error];
    

    【讨论】:

    • 谢谢,这对我有用 - 我必须在保存和加载时添加一个“.mp4”
    • 感谢您对它的注释必须在 Caches 目录中 - 我真的以为我疯了(我愚蠢地还在 temp 目录而不是 caches 目录中创建了符号链接)。
    • @AlexStone 对我来说,符号链接创建返回 true,但 MPMoviePlayerViewController 抛出错误 'Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory'。有什么线索吗?有没有办法我可以确认除了 createSymbolicLinkAtURL 方法的返回值之外,符号链接是否存在?
    • @geekoraul 很难说,但我会仔细检查符号链接创建和读取文件时的 absolute 路径以确保它们相同,并且两者是文件 URL。您还可以使用 NSFileManager 检查符号链接是否存在。
    【解决方案2】:

    我遇到了类似的问题,流文件运行良好,但无法播放本地文件。以下更改为我解决了它:

    NSURL *fileURL = [NSURL URLWithString:filePath];
    

    到:

    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    

    【讨论】:

    • 这当然是一个有价值的见解。
    • 实际上,如果 OP 调用 URLForResource:withExtension: 开始,则整个问题都可以避免 - 即,预先获取 NSURL,而不是获取 NSString 并(错误地)转换为 NSURL .
    猜你喜欢
    • 2014-03-30
    • 2014-01-02
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多