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

时间:2011-03-31 14:43:15

标签: iphone ios mpmovieplayercontroller avplayer

我想在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文件,因为当我重命名它时,一切都很好。

8 个答案:

答案 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])

源-> https://stackoverflow.com/a/54087143/6736184