我想在iPad上播放iOS 4.3中的电影。当文件名具有文件扩展名时,我已成功使用MPMoviePlayerController和AVPlayer从远程URL加载文件。但是,当我使用不返回文件名的CDN(只是一个不可猜测的随机名称)时,MPMoviePlayerController或AVPlayer似乎都无法应对。
有没有办法告诉任何一个玩家它真的是x类型的电影,它应该继续播放?
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文件,因为当我重命名它时,一切都很好。
答案 0 :(得分:7)
tmp的文件
NSString* _filePath
创建符号链接
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 播放视频
答案 1 :(得分:4)
如果玩家无法猜测文件格式,则需要检查CDN是否发送了正确的mime类型。我的猜测是你的CDN不能正确猜测mimetype,也不能猜测玩家。
在大多数情况下,这是由于CDN如何呈现HTTP标头。 检查“内容类型”标题是否设置为与您的内容匹配的视频格式。
答案 2 :(得分:2)
迪伦是对的。
MPMoviePlayer和AVPlayer都需要文件扩展名才能从URL播放文件,否则将显示错误消息。最好使用某种技巧。
答案 3 :(得分:1)
iPhone支持视频H.264,MPEG-4 .mp4,.m4v,.mov格式以及AAC,MP3,M4a,Apple无损和Audible中的音频文件。 您可以使用NSFileManager的-contentsOfDirectoryAtPath:error:方法获取包含目录内容的数组(作为字符串)。然后您只需执行字符串操作。
答案 4 :(得分:1)
如果您在获取连接的ContentType时遇到问题,可以循环播放可播放的MIME类型,并使用扩展名创建指向实际文件的符号链接,并检查它们是否可播放。像这样:
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;
}
}
}
答案 5 :(得分:1)
WebKit通过私有 AVURLAsset选项处理此问题:AVURLAssetOutOfBandMIMETypeKey
,当您在HTML video
标记中指定MIME类型时使用此选项,< / p>
您可以使用以下选项:
NSString * mimeType = @"video/mp4";
// or even with codecs
mimeType = @"video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"";
// create asset
AVURLAsset * asset = [[AVURLAsset alloc] initWithURL:url options:@{@"AVURLAssetOutOfBandMIMETypeKey": mimeType}];
// create AVPlayer with AVURLAsset
AVPlayer * player = [AVPlayer playerWithPlayerItem:[AVPlayerItem playerItemWithAsset:asset]];
由于它是私钥,如果您打算将其提交到AppStore,可能需要对其进行模糊处理。
可以在此处找到WebKit源代码: https://opensource.apple.com/source/WebCore/WebCore-7604.1.38.1.6/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm.auto.html
答案 6 :(得分:0)
这是一种黑客行为,但你可以做的是通过一种方法运行每个名称,该方法检查一个句点后面有三个字符。如果没有,只需自动附加.m4v即可。或者获取MIME类型并根据返回的类型自动附加扩展名。如果可供使用的话。查看使用NSString的文档以获取更多信息。祝好运!如果有帮助,请告诉我。
答案 7 :(得分:0)
最后,我找到了答案。
您应该使用AVURLAsset(AVAsset的子类)并在输入的选项中设置MIMEType:
let mimeType = "video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\""
let urlAsset = AVURLAsset(url: url, options["AVURLAssetOutOfBandMIMETypeKey": mimeType])