29

iPadのiOS4.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ファイルであることを知っています。

4

8 に答える 8

9

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でビデオを再生

于 2013-05-08T14:58:09.537 に答える
5

プレーヤーがファイル形式を推測できない場合は、CDNが正しいmimeタイプを送り返すことを確認する必要があります。私の推測では、CDNはmimetypeを正しく推測できず、プレーヤーも推測できません。

ほとんどの場合、これはCDNがHTTPヘッダーを提示する方法が原因です。「Content-Type」ヘッダーがコンテンツに一致するビデオ形式に設定されていることを確認してください。

于 2012-03-31T11:44:08.383 に答える
4

WebKitはこれをプライベートAVURLAssetオプションで処理します: 、このオプションは、HTMLのタグでAVURLAssetOutOfBandMIMETypeKeyMIMEタイプを指定するときに使用されます。video

このオプションは次のように使用できます。

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

于 2018-02-02T09:11:30.213 に答える
1

iPhoneは、ビデオH.264、.mp4、.m4v、.mov形式のMPEG-4、およびAAC、MP3、M4a、Apple Lossless、Audibleのオーディオファイルをサポートしています。NSFileManagerの-contentsOfDirectoryAtPath:error:メソッドを使用して、ディレクトリの内容を含む配列を(文字列として)取得できます。次に、文字列操作を実行します。

于 2011-09-22T09:30:37.783 に答える
1

ディランは正しいです。

MPMoviePlayerとAVPlayerはどちらも、URLからファイルを再生するためにファイル拡張子が必要です。そうしないと、エラーメッセージが表示されます。ある種のトリックを使うほうがいいです。

于 2012-03-09T09:11:38.747 に答える
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;
        }
    }

}
于 2016-08-26T12:46:13.083 に答える
1

最後に、私は答えを見つけました。

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

于 2020-07-01T06:18:04.090 に答える
0

これは一種のハックですが、実行できるのは、各名前の後に3文字のピリオドがあるかどうかをチェックするメソッドを実行することです。そうでない場合は、.m4vを自動的に追加します。または、MIMEタイプを取得し、返されたタイプに基づいて自動的に拡張機能を追加します。可能な場合は。詳細については、NSStringのドキュメントを参照してください。幸運を!それが役に立ったかどうか教えてください。

于 2011-08-13T08:42:43.987 に答える