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

tcomlyy6  于 2022-11-19  发布在  iOS
关注(0)|答案(8)|浏览(179)

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

6tdlim6h

6tdlim6h1#

临时文件

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播放视频

ulmd4ohb

ulmd4ohb2#

如果播放器不能猜出文件格式,你需要检查CDN是否发送了正确的mime类型。我的猜测是,你的CDN不能正确地猜出mime类型,播放器也不能。
在大多数情况下,这是由于CDN呈现HTTP报头的方式。检查“Content-Type”报头是否设置为与您的内容匹配的视频格式。

bxgwgixi

bxgwgixi3#

WebKit通过一个PrivateAVURLAsset选项处理此问题:AVURLAssetOutOfBandMIMETypeKey,当您在HTML的video标签中指定MIME类型时,会使用此选项。
您可以使用此选项,例如:

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

cyvaqqii

cyvaqqii4#

终于,我找到了答案。
您应该使用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

f2uvfpb9

f2uvfpb95#

iPhone支持H.264,MPEG-4,.mp4,.m4v,.mov格式的视频和AAC,MP3,M4a,Apple无损和Audible格式的音频文件。您可以使用NSFileManager的-contentsOfDirectoryAtPath:error:方法来获取一个包含目录内容的数组(作为字符串)。然后,您只需执行字符串操作。

holgip5t

holgip5t6#

迪伦说得对。
MPMoviePlayer和AVPlayer都需要一个文件扩展名才能从URL播放文件,否则会显示错误消息。最好使用一些技巧。

jfgube3f

jfgube3f7#

如果你在获取连接的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;
        }
    }

}
3pvhb19x

3pvhb19x8#

这是一种技巧,但你可以做的是通过一个方法运行每个名称,该方法检查后面是否有三个字符的句点。如果没有,就自动附加.m4v。或者获取MIME类型并根据返回的类型自动附加扩展名。如果有,请查找带有NSString的文档以获得更多信息。祝你好运!如果有帮助,请告诉我。

相关问题