10

AVPlayerを使用してプログレッシブダウンロードビデオをキャッシュしたいと思います。AVPlayerのアイテムをディスクに保存するにはどうすればよいですか?プレーヤーのcurrentItem(完全にロードされている)でAVAssetExportSessionを使用しようとしています。このコードは私に「AVAssetExportSessionStatusFailed(操作を完了できませんでした)」を与えています:

    AVAsset *mediaAsset = self.player.currentItem.asset;

    AVAssetExportSession *es = [[AVAssetExportSession alloc] initWithAsset:mediaAsset presetName:AVAssetExportPresetLowQuality];

    NSString *outPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"out.mp4"];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager removeItemAtPath:outPath error:NULL];

    es.outputFileType = @"com.apple.quicktime-movie";
    es.outputURL = [[[NSURL alloc] initFileURLWithPath:outPath] autorelease];
    NSLog(@"exporting to %@",outPath);
    [es exportAsynchronouslyWithCompletionHandler:^{
        NSString *status = @"";

        if( es.status == AVAssetExportSessionStatusUnknown ) status = @"AVAssetExportSessionStatusUnknown";
        else if( es.status == AVAssetExportSessionStatusWaiting ) status = @"AVAssetExportSessionStatusWaiting";
        else if( es.status == AVAssetExportSessionStatusExporting ) status = @"AVAssetExportSessionStatusExporting";
        else if( es.status == AVAssetExportSessionStatusCompleted ) status = @"AVAssetExportSessionStatusCompleted";
        else if( es.status == AVAssetExportSessionStatusFailed ) status = @"AVAssetExportSessionStatusFailed";
        else if( es.status == AVAssetExportSessionStatusCancelled ) status = @"AVAssetExportSessionStatusCancelled";

        NSLog(@"done exporting to %@ status %d = %@ (%@)",outPath,es.status, status,[[es error] localizedDescription]);
    }];

どうすれば正常にエクスポートできますか?mediaAssetをAVMutableCompositionにコピーすることを検討していますが、それもあまりうまくいきませんでした。

ありがとう!

PS:同じことを達成しようとしている人々からのいくつかの質問があります(ただしMPMoviePlayerControllerを使用):

4

2 に答える 2

9

私はまだ iOS 4.3 SDK を使用していませんが、4.3 での mediaAsset.exportable の値を知りたいと思っています。

http://developer.apple.com/library/ios/#releasenotes/AudioVideo/RN-AVFoundation/_index.html#//apple_ref/doc/uid/TP40010717-CH1-SW4

利用可能なリストからプリセット名とファイルタイプを取得するなど、コードにいくつかの変更を試みましたが、あなたと同じエラーが発生しています。

ドキュメントには、AVAssetReader と AVAssetWriter を接続して、より多くの制御を除いて AVAssetExportSession と同じ効果を得ることができると記載されているため、低レベルのフレームワークを試すことにしました。ただし、次のコード:

NSError *readerError = nil;
AVAssetReader *reader = 
  [AVAssetReader assetReaderWithAsset:mediaAsset error:&readerError];
if (readerError) NSLog(@"Error instantiating asset reader: %@",
  [readerError localizedDescription]);

次の出力が得られます。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '*** -[AVAssetReader initWithAsset:error:] Cannot initialize an instance of 
AVAssetReader with an asset at non-local URL 'http://example.com/test.mp3''

これを実際の URL でテストしましたが、上記の偽の URL に置き換えたことに注意してください。これは、私たちが探している機能を iOS がサポートしていないように見えます。私が知っている限りでは、AVAssetExportSession は内部で AVAssetReader を使用しており、失敗した場合は説明の少ないエラーを報告するだけです。彼らがそれをそのように文書化するだけなら、それは確かにいいでしょう. AVAssetExportSession のドキュメントには、アセットがローカルである必要があることについては何も言及されていません。

http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAssetExportSession_Class/Reference/Reference.html#//apple_ref/occ/cl/AVAssetExportSession

これが大した答えではないことはわかっていますが、調査を少し進めます。この機能を必要としているのは明らかに私たちだけではないので、これを行う何らかの方法があることを今でも本当に望んでいます。

于 2011-06-13T16:31:57.533 に答える
0

確かに、iOS 4.X では動作しません。iOS 5 Beta で動作させようとした人はいますか?

欠落した機能のようです。ドキュメントのどこにも、ネットワーク化されたメディアへのデータ アクセスをサポートしていないとは記載されていません。API を実行しようとすると、API のエラー メッセージやその他のものでさえ、奇妙で不完全なように見えます。ほとんどの場合、すぐにサポートされます。

于 2011-07-05T17:52:06.707 に答える