問題タブ [avassetreader]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - AVPlayerItem をエクスポートできません
AVQueuePlayer
アプリで動画のリストを再生するために使用しています。AVQueuePlayer
ビデオを毎回ダウンロードする必要がないように、再生されるビデオをキャッシュしようとしています。
そのため、ビデオの再生が終了したら、AVPlayerItem をディスクに保存して、次回はローカル URL で初期化しようとします。
私は2つのアプローチでこれを達成しようとしました:
- AVAssetExportSession を使用する
- AVAssetReader と AVAssetWriter を使用します。
1) AVAssetExportSession アプローチ
このアプローチは次のように機能します。
AVPlayerItem
が を使用して演奏を終了するのを観察しAVPlayerItemDidPlayToEndTimeNotification
ます。- 上記の通知を受け取ると (ビデオの再生が終了したため、完全にダウンロードされます)、
AVAssetExportSession
そのビデオをディスク内のファイルにエクスポートするために使用します。
コード:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
それから
- (void)videoDidFinishPlaying:(NSNotification*)note
{
AVPlayerItem *itemToSave = [note object];
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:itemToSave.asset presetName:AVAssetExportPresetHighestQuality];
exportSession.outputFileType = AVFileTypeMPEG4;
exportSession.outputURL = [NSURL fileURLWithPath:@"/path/to/Documents/video.mp4"];
[exportSession exportAsynchronouslyWithCompletionHandler:^{
switch(exportSession.status){
case AVAssetExportSessionStatusExporting:
NSLog(@"Exporting...");
break;
case AVAssetExportSessionStatusCompleted:
NSLog(@"Export completed, wohooo!!");
break;
case AVAssetExportSessionStatusWaiting:
NSLog(@"Waiting...");
break;
case AVAssetExportSessionStatusFailed:
NSLog(@"Failed with error: %@", exportSession.error);
break;
}
}
そのコードのコンソールでの結果は次のとおりです。
2) AVAssetReader、AVAssetWriter アプローチ
コード:
- (void)savePlayerItem:(AVPlayerItem*)item
{
NSError *assetReaderError = nil;
AVAssetReader *assetReader = [[AVAssetReader alloc] initWithAsset:assetToCache error:&assetReaderError];
//(algorithm continues)
}
AVAssetReader
次の情報を使用して割り当て/初期化しようとすると、そのコードは例外をスローします。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetReader initWithAsset:error:] Cannot initialize an instance of AVAssetReader with an asset at non-local URL 'https://someserver.com/video1.mp4''
***
どんな助けでも大歓迎です。
ios - avassetreader を使用して 2 つのファイルから次々に読み取る
必要なのは、2 つのムービー ファイルをマージすることです。必要なのは、ファイルから読み取り、サンプルを別のファイルに書き込むことです。1 つのファイルから読み取って、2 番目のファイルの読み取りを続行するにはどうすればよいですか。そのため、AVAssetwritter に追加できるサンプル バッファを継続的に受け取ります。
ios - AVAssetWriter で動画ファイルを結合する
特定のコーデック設定を使用して、複数のビデオ ファイルを 1 つのファイルに結合しようとしています。これには を使用していAVAssetExportSession
ましたが、今ではAVAssetExportSession
オファーよりもコーデックをより詳細に制御する必要があります。
createFinalVideo:
以下に、ビデオ ファイルの組み合わせを処理する関数を掲載しました。
AVAssetWriter
私が取ったアプローチは、次のビデオを追加する必要がある場所でセッションを開始するだけで、同じファイルに書き込もうとすることです。AVAssetWriter
明らかにこの動作が許可されていないため、これが機能しないことはわかっています。
以前AVAssetWriter
は、for ループの外側で を定義しており、各ビデオ ファイル (for ループの各パス) に新しい入力を追加しようとしていました。ただし、呼び出されたAVAssetWriter
後に新しい入力を追加することはできないようです。[AVAssetWriter startWriting]
私の質問は、私が正しい方法でやろうとしていることをどのように行うのですか?
ios - AVAssetReader / AVAssetWriter 異なる解像度のmp4ファイルを結合
mp4 ファイルを異なる解像度で結合する必要がある iPad アプリをコーディングしています。そのために、AVAssetReader を組み合わせて mp4 ソース ファイルを読み取り、AVAssetWriter を使用してこれらのソース ファイルを単一の mp4 出力ファイルに書き込みます。
AVAssetExportSession を使用しようとしましたが、結合された異なるファイル間に黒いフレームがあったという問題がありました。
私が今直面している問題は、すべて問題ないように見えますが、AVAssetWriter の完了ハンドラーが呼び出されないことです。
これは、mp4 ファイル URL のリスト、単一の出力ファイル URL、および完了ハンドラーを入力として受け取るセレクターです。
私の出力ファイルは存在し、AVAssetWriter はプロパティであるため存在しますが、完了ハンドラーは呼び出されません。これを説明できるものは何ですか?
ご協力いただきありがとうございます。
それを説明できるものは何ですか?
macos - CMSampleBufferRef と AVAssetReaderMixAudioOutput と PCM の問題
そのため、AVAssetReaderMixAudioOutput を使用して、quicktime ファイルからオーディオ サンプルを抽出しています。この場合、複数のオーディオ トラックを含む ProRes ビデオです。
(4 トラック、16 ビット、インターリーブ サンプル littleEndian @ 48000)
ビデオ フレームを正常に取得できますが、[myAssetReaderAudioMixOutput copyNextSampleBuffer] を呼び出すと、奇妙な問題が発生します..返されるオーディオはすべて最初のチャネルにあるようです。
個々の trackOutputReader を使用して、最初のフレームの各トラックの最初のオーディオ サンプルを取得します。
620B 700E 0000 0000
しかし、AVAssetReaderMixAudioOutput を使用すると、
D219 0000 0000 0000
(620B + 700E = D219 であることに注意してください) AVAssetReaderMixAudioOutput が 4 つのチャネル全体のすべての値を合計し、結果をトラック 1 に表示しているように見えます??
誰でも理由を説明できますか?そしてそれを修正する方法は?チャンネルが QuickTime ファイルにあるように、チャンネルを 1:1 でマッピングするソリューションが必要です。1 チャンネルと 16 チャンネルの両方のオーディオを含むファイルで動作する必要があります。
各オーディオ チャネル/タックで copyNextSampleBuffer を単独で実行することにより、最初のサンプルの正しい値を取得しました。
これは、myAssetReaderAudioMixOutput を作成するために使用した辞書です....
次のコードを使用して、CMSampleBuffer から実際のオーディオ サンプル/データを読み取ります。
enteraudioBuffer = [assetReaderAudioMixOutput copyNextSampleBuffer]; if (audioBuffer) { CMBlockBufferRef audioBlockBuffer = CMSampleBufferGetDataBuffer(audioBuffer);
}
(申し訳ありませんが、コードを貼り付けるとコードが壊れているようです。理由はわかりません。いくつかの異なることを試しました-申し訳ありません)
だから私の問題は、辞書を設定するか、サンプルを読むことにあると思います。私は同じシステムを使用して 1 つのトラックのサンプルを読み取りますが、それでよいのでしょうか? 4 トラックの正しい量のデータ/サンプルを提供しているのに、最初のトラックにしか情報を入れていない理由が理解できません。
最後に、私は OSX を使用しています。iOS は気にしません。
助けてくれてありがとう、これは非常にイライラさせられました!
- ジェームズ
cocoa - AVAssetReaderOutput を使用した早送りの実装
GPUImage を多用するアプリに早送り機能を追加しようとしていますが、メモリの問題が発生しています。
の上部で-[GPUImageMovie readNextVideoFrameFromOutput:]
、これを置き換えます。
これとともに:
これは数秒間は見事に機能しているように見えますが、メモリの問題によりアプリが強制終了されます。リークがないように見えるので、割り当て率が高いと思います。誰でもこれを経験したことがありますか?何かご意見は?
video - AVfoundation リバース ビデオ
動画を逆さまにしてみました。AVPlayer でアセットを再生しているときに、レートを -1 に設定して逆フォーマットで動作させます。しかし、そのビデオをエクスポートする方法は? ドキュメントを調べました。avassetwrite、sambuffers、compositions について読みましたが、これを行う方法が見つかりませんでした。以下のリンクは私が参照しています
http://www.raywenderlich.com/13418/how-to-play-record-edit-videos-in-ios
リバース ビデオのデモ - https://github.com/mikaelhellqvist/ReverseClip
上記の例は、IOS 8 では機能しなくなりました。さらに、オーディオが反転していません。誰かが私にそれについて少しヒントを与えてくれれば、私はさらにやることができます. 私は過去 5 日間ここで立ち往生していますが、ドキュメントで答えが見つかりませんでした。