問題タブ [mediaextractor]
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.
android - Android MediaCodec デコーダの入出力フレーム数
私は Android でのビデオ トランスコーディングに取り組んでおり、これらのサンプルとして標準的な方法を使用してビデオを抽出/デコードしています。さまざまなビデオ デバイスを搭載したさまざまなデバイスで同じプロセスをテストしたところ、デコーダの入出力のフレーム カウントに問題があることがわかりました。
この質問のようなタイムコードの問題については、次のコードのように、キューを使用して抽出されたビデオ サンプルを記録し、デコーダー フレーム出力を取得したときにキューを確認します。
場合によっては、デコーダがエラー値 (たとえば、多数の 0) を与える場合、キューは PTS を「修正」できます。ただし、デコーダーの入出力のフレーム数に関しては、まだいくつかの問題があります。
HTC One 801e デバイスでは、コーデック OMX.qcom.video.decoder.avc を使用してビデオをデコードします (MIME タイプ video/avc を使用)。サンプル時間と PTS は、最後のフレームを除いて、フレームでよく一致しています。たとえば、エクストラクタが 100 フレームをフィードし、次に EOS をデコーダにフィードする場合、最初の 99 のデコードされたフレームはまったく同じ時間値を持ちますが、最後のフレームが失われ、デコーダから EOS が出力されます。内蔵カメラ、ffmpeg マルチプレクサー、または Windows 上のビデオ処理 AP によってエンコードされたさまざまなビデオをテストします。いずれも最後の1コマが消えています。
OMX.MTK.VIDEO.DECODER.AVC コーデックの一部のパッドでは、状況がさらに混乱します。一部のビデオは、デコーダからの良好な PTS を持ち、入力/出力フレーム カウントは正しいです (つまり、デコードが完了すると、キューは空になります)。一部のビデオでは、一貫した入力/出力フレーム カウントがあり、デコーダー出力の PTS が正しくありません (キューでそれらを修正することもできます)。一部のビデオでは、デコード中に多くのフレームが失われます。たとえば、エクストラクタは 7 秒のビデオで 210 フレームを取得しますが、デコーダは最後の 180 フレームのみを出力します。同じ回避策を使用して PTS を回復することはできません。
MediaCodec デコーダーの入出力フレーム数を期待する方法はありますか? または、より正確には、エクストラクタが正しいサンプル時間でビデオ サンプルを提供している間に、デコーダによってドロップされたフレームを知るには?
android - SurfaceTexture の onFrameAvailable() メソッドの呼び出しが常に遅すぎる
次の MediaExtractor の例を機能させようとしています:
http://bigflake.com/mediacodec/ - ExtractMpegFramesTest.java (4.1、API 16 が必要)
私が抱えている問題は、outputSurface.awaitNewImage(); です。mFrameSyncObject.wait(TIMEOUT_MS)
呼び出しがタイムアウトするたびにスローされる RuntimeException("frame wait timed out") を常にスローするようです。何を設定TIMEOUT_MS
しても、タイムアウトが発生した直後にonFrameAvailable()
常に呼び出されます。50msと30000msで試してみましたが同じです。
onFrameAvailable()
スレッドがビジー状態の間は呼び出しを実行できないようです。タイムアウトが発生してスレッド コードの実行が終了すると、呼び出しを解析できますonFrameAvailable()
。
この例を機能させることができた人はいますか、または MediaExtractor が GL テクスチャでどのように機能するかを知っていますか?
編集: API 4.4 および 4.1.1 を搭載したデバイスでこれを試したところ、両方で同じことが起こりました。
編集2:
fadden のおかげで 4.4 で動作するようになりました。問題は、ExtractMpegFramesWrapper.runTest()
呼び出されたメソッドth.join();
がメイン スレッドをブロックし、onFrameAvailable()
呼び出しが処理されないことでした。コメントth.join();
すると、4.4で動作します。ExtractMpegFramesWrapper.runTest()
メインスレッドがブロックされないように、それ自体がさらに別のスレッドで実行されるはずだったのかもしれません。
を呼び出すときに 4.1.2 にも小さな問題がありcodec.configure()
、エラーが発生しました。
呼び出しの前に次を追加することで解決しました:
ただし、4.1.1 (Galaxy S2 GT-I9100) と 4.1.2 (Samsung Galaxy Tab GT-P3110) の両方で現在発生している問題は、すべてのフレームで常に info.size を 0 に設定していることです。ログ出力は次のとおりです。
したがって、画像は保存されません。ただし、同じコードとビデオは 4.3 でも機能します。私が使用しているビデオは、「H264 - MPEG-4 AVC (avc1)」ビデオ コーデックと「MPEG AAAC Audio (mp4a)」オーディオ コーデックの .mp4 ファイルです。
他のビデオ形式も試してみましたが、4.1.x ではもっと早く死んでいるように見えますが、4.3 ではどちらも動作します。
編集3:
あなたが提案したとおりにしましたが、フレーム画像が正しく保存されているようです。ありがとうございました。
KEY_MAX_INPUT_SIZEについては、設定しないか、0, 20, 200, ... 200000000に設定してみましたが、いずれもinfo.size=0と同じ結果になりました。
レイアウトでレンダリングを SurfaceView または TextureView に設定できなくなりました。この行を置き換えてみました:
これで、surfaceTexture
私のxml-layoutで定義されたSurfaceTextureはどこにありますか:
getMessage()==null
しかし、2行目で奇妙なエラーがスローされます。ある種のビューに描画する他の方法を見つけることができませんでした。フレームを保存する代わりに、Surface/SurfaceView/TextureView にフレームを表示するようにデコーダを変更するにはどうすればよいですか?
android - android.media.MediaExtractor サンプル フラグ
の意味は何ですか:
- SAMPLE_FLAG_SYNC
- SAMPLE_FLAG_ENCRYPTED
オーディオ ファイルの「サンプル イン シンク」の概念を理解するのが困難です。
また、「シーン全体」を理解するためのテクニカル リファレンスを提案してください。
android - MediaExtractor seekTo および AudioTrack フラッシュ動作の後の Android MediaCodec フラッシュが予想外に悪い
AudioTrack、MediaCodec、および MediaExtractor の組み合わせを使用して、音楽をデコードおよび再生しています。
ドキュメントによると、
以前に送信されたデータに隣接していないデータのデコードを開始するには (つまり、シーク後)、デコーダーを flush() する必要があります。フラッシュの時点でクライアントが所有している可能性のある入力または出力バッファーは、すぐに取り消されます。つまり、flush() の呼び出し後、クライアントはバッファーを所有しなくなります。
mAudioTrack.flush(); も呼び出す必要があるように、シーク後にフラッシュを呼び出しています。
フラッシュが呼び出されますが、audioTrack は以前に書き込まれたデータの一部を再生し、新しく書き込まれたデータから続行します。
Decoder.flush を呼び出さないと、オーディオ再生で顕著な不具合が発生する可能性があります。では、この瞬間的なフラッシュを実現し、新しく書き込まれたデータの再生を継続するにはどうすればよいでしょうか?
コードスニペット:
更新されたコード
android - MediaExtractor は、「.m4s」を抽出するときに IOException「エクストラクタのインスタンス化に失敗しました」をスローします
Android 4.4 で mediaExtractor によって「m4s」プレーヤーを実装しようとしています。ただし、「m4s」データ ソースを設定すると、mediaExtractor は IOException をスローします。以下は私のコードスニペットです
例外はネイティブ メソッドからスローされます。これは、「m4s」が Android でサポートされていないということですか?
同じコードを使用して「mp4」を正常に抽出しました。Android ネイティブが「m4s」をサポートしている場合は、どの部分を構成する必要があるかを示してください。
android - Android でビデオ フレームの総数を取得する方法はありますか?
現在、Android で MediaCodec と MediaExtractor を使用して、Android でビデオを抽出、デコード、編集、および再エンコードしています。このプロセスの過程で、進行状況に関する情報をユーザーに提供したいと思います。抽出、デコード、およびエンコードされたフレームの数をすでに数えています。パーセンテージを計算し、プロセスの進行状況をユーザーに表示するには、元のストリームのフレームの総数が必要です。ただし、MediaExtractor でメソッドが見つかりません。
抽出を開始する前に、ビデオのフレームの総数を取得する方法を知っている人はいますか?
android - MediaCodec、MediaExtractor、または MediaMetadataRetriever でビデオ ファイルのフレームレートを決定する方法は?
録画したビデオ ファイルのフレーム レートを抽出するにはどうすればよいですか? MediaFormat.KEY_FRAME_RATE があり、MediaExtractor を介して MediaFormat オブジェクトにアクセスできることを知っています。ただし、KEY_FRAME_RATE はエンコーダーでのみ使用できます。代わりに、既に録画されたビデオのフレーム レートを調べたいと考えています。
何か案は?