如何在iOS上用MPMoviePlayerController或AVPlayer播放没有文件扩展名的电影文件?

我想在iPad上用iOS 4.3播放电影。 当文件名具有文件扩展名时,我已成功使用MPMoviePlayerController和AVPlayer从远程URL加载文件。 但是,当我使用不返回文件名的CDN(只是一个不可猜测的随机名)时,MPMoviePlayerController或AVPlayer似乎都无法应付。

有没有办法告诉任何一个玩家,它确实是一个xtypes的电影,它应该继续玩呢?

MPMoviePlayerController将从其更改的状态通知中返回以下错误:

{ MPMoviePlayerPlaybackDidFinishReasonUserInfoKey = 1; error = "Error Domain=MediaPlayerErrorDomain Code=-12847 \"This movie format is not supported.\" UserInfo=0x5b60030 {NSLocalizedDescription=This movie format is not supported.}"; } 

我知道这个文件是一个有效的m4v文件,因为当我重命名它一切都很好。

如果播放器无法猜测文件格式,则需要检查CDN是否发回了正确的MIMEtypes。 我的猜测是你的CDN无法正确猜测mimetype,玩家也不能。

在大多数情况下,这是由于CDN如何呈现HTTP标头。 检查“Content-Type”标题是否设置为与您的内容匹配的video格式。

在tmp文件

 NSString* _filePath 

创build符号链接

 NSFileManager *filemgr = [NSFileManager defaultManager]; NSString *slink = [_filePath stringByAppendingPathExtension:@"m4v"]; if (![filemgr fileExistsAtPath:slink]) { NSError *error = nil; [filemgr createSymbolicLinkAtPath:[_filePath stringByAppendingPathExtension:@"m4v"] withDestinationPath: _filePath error: &error]; if (error) { ... } } ... 

通过slink播放video

迪伦是正确的。

MPMoviePlayer和AVPlayer都需要一个文件扩展名才能播放来自URL的文件,否则会显示错误信息。 更好地使用某种技巧。

iPhone支持H.264,MPEG-4格式的.mp4,.m4v,.mov格式以及AAC,MP3,M4a,Apple无损和Audible格式的audio文件。 你可以使用NSFileManager的-contentsOfDirectoryAtPath:error:方法来获得一个包含目录内容(作为string)的数组。然后你只需要进行string操作。

如果您在连接的ContentType时遇到问题,您可以循环播放可播放的MIMEtypes,并使用扩展名创build带有实际文件的符号链接,并检查它们是否可播放。 像这样:

 NSLog(@"linked path: %@",[videoURL absoluteString]); NSString* linkedPath; AVURLAsset* asset; NSFileManager *filemgr = [NSFileManager defaultManager]; for (NSString* string in [AVURLAsset audiovisualMIMETypes]) { if ([string containsString:@"video/"]) { NSLog(@"Trying: %@",string); linkedPath = [[videoURL absoluteString] stringByAppendingPathExtension:[string stringByReplacingOccurrencesOfString:@"video/" withString:@""]]; NSLog(@"linked path: %@",linkedPath); if (![filemgr fileExistsAtPath:linkedPath]) { NSError *error = nil; [filemgr createSymbolicLinkAtURL:[NSURL URLWithString:linkedPath] withDestinationURL:videoURL error:&error]; if (error) { NSLog(@"error %@",error.localizedDescription); } } asset = [AVURLAsset assetWithURL:[NSURL URLWithString:linkedPath]]; if ([asset isPlayable]) { NSLog(@"Playable"); break; }else{ NSLog(@"Not Playable"); asset = nil; } } } 

这是一种黑客,但你可以做的是通过一个方法来检查每个名字后面有三个字符。 如果不是,则自动附加.m4v。 或者获取MIMEtypes并根据返回的types自动附加扩展名。 如果可供使用的话。 使用NSString查找文档以获取更多信息。 祝你好运! 让我知道这是否有帮助。