問題タブ [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 - MediaExtractor は H264 NAL ユニットをどのように解析しますか?
Android MediaExtractor が H264 (コンテナー形式に含まれる) を解析する方法を理解しようとしています。
H264 ストリームを調べると、シーケンス 00 00 00 01 で区切られた NAL ユニットで構成されていることがわかります。
MediaExtractor によって返されるサンプルは、それぞれがそのマーカーで始まる正確な NAL ユニットです。ただし、特定のデータ ソースについては、最初の 3 つの NAL ユニットが連結されます。最初の 2 つの NAL ユニットは非常に短い (29 バイトと 8 バイト)。
なぜその連結が起こるのですか?H264 を手動で解析する場合、その連結を行う方法をどのように知ることができますか?
最初の 3 つの NAL ユニットでは、開始コード プレフィックスに続くバイトは 10 進数で 103、104、および 101 です。次の NAL ユニットのほとんどは 65 で、場合によっては 101 です。
android - MediaExtractor は H264 NAL ユニットに何を入れるかをどのように決定しますか?
2 つの Android デバイスで MediaExtractor の出力を調べたところ、同じビデオ ファイルを指定しても、わずかに異なるサンプルが生成されるようです。
1 つのデバイスでは、非 VCL NAL ユニットが次の VCL ユニットに連結されてサンプルが生成されます。他のデバイスでは、各非 VCL ユニットが完全なサンプルを構成します。
もう 1 つの違い: あるデバイスでは、サンプルの先頭に 0 バイトと開始コード プレフィックス (001) があります。一方、それらのバイトは省略されます。
他のデバイスで最初のデバイスに NAL ユニットの形式を使用しようとすると、ビデオが再生されません。
(MediaExtractor を使用せずに) 独自の NAL ユニットを生成している場合、MediaCodec H264 デコーダーが期待している形式を知る原則的な方法はありますか?
android - 動画の URL を指定して、動画のクリップを Android フォンに保存するにはどうすればよいですか?
ビデオの URL (例: www.example.com/video.mp4) を指定して、Android でビデオの短いクリップ (例: 5 秒、00:00:10 - 00:00:15) をプログラムで保存するにはどうすればよいですか?電話へのアプリケーション?
現時点では、これが私が持っているものですが、これにより、ビデオ全体が URL からデバイスに保存されます。MediaExtractor と MediaMuxer を使用する必要があるようです。
android - オーディオ コーデック dequeueInputBuffer がデバイスで -1 を返す
MPEG2 トランスポート (.ts) ファイルから取得したオーディオを再生しようとしています。MediaExtractor 経由でオーディオ ストリームを取得し、readSampleData を使用してサンプルを MediaCodec 入力バッファーにコピーし、MediaCodec 出力バッファーを AudioTrack に書き込みます。MediaExtractor は、オーディオ MIME タイプを「audio/mp4a-latm」として示します。
これらすべてが、Nexus 7 2013 タブレットで見事に機能します。
しかし、安価な Neutab x7 タブレットではまったく機能しません。問題は、いくつかのサンプルの後、dequeueInputBuffer が繰り返し -1 を返すことです。AudioTrack.write() への呼び出しをコメントアウトしてもその事実は変わらないため、問題は MediaCodec の操作にあります。
コードは次のようになります (ログ、一部のエラー処理は省略):
はaudioCodec
、 から取得した MediaFormat で構成されaudioExtractor
ます。TIMEOUT を大きな値に増やしてみましたが、喜びはありません。
これら 2 つのデバイスでこのコードの動作が異なるのはなぜですか? 回すノブはありますか?
Neutab には、このファイルを問題なく再生する「Videos」アプリがあります。logcat に Omx* エントリが表示されるので、libstagefright を直接使用している可能性があります。
android - ExtractMpegFramesTest で、Android のポートレート モードで録画されたビデオに問題が発生する
ExtractMpegFramesTestの投稿に従って、ビデオから PNG フレームを抽出しています。これは、横向きモードで録画されたビデオでは正常に機能しますが、縦向きモードで録画されたビデオでは機能しません。
上記のリンクで提供されているソリューションを使用して、ポートレート ビデオから PNG フレームを生成する方法を知っている人はいますか?
720p と 1080p のビデオでこれをテストしました。
私が観察したいくつかのことは、
MediaExtractor は、方向に関係なく、720p ビデオの幅と高さを 1280 と 720 にします。これは、横向きで 1280 x 720、縦向きで 720 x 1280 である必要があります。1080p ビデオでも同様のケースです。
その他のことは、invert パラメータのメソッド drawFrame で false を渡すと、PNG フレームは問題ありませんが、上下が逆になります。
編集:
ExtractMpegFramesTest を使用すると、この結果が得られます
invert パラメータが true の横向きビデオは完璧な画像 http://postimg.org/image/qdliypuj5/を提供します
invert パラメータが true のポートレート ビデオは、歪んだ画像を 生成しますhttp://postimg.org/image/vfb7dwvdx/
invert パラメータ false を使用したポートレート ビデオは、完全な逆さまのイメージを提供します (@Peter Tran の回答によると、出力はビットマップを回転させることで修正できます )
java - MediaExtractor および MediaCodec を使用したビデオ再生でフレームをスキップする
MediaExtractor/MediaCodec を使用してビデオをデコードし、TextureView にレンダリングしています。テンプレートとして、 https ://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java のコードを使用しました。
動画を2倍速で再生したいです。幸いなことに、メディアのエンコード/デコードは十分に高速であるため、MediaCodec ですべてのフレームをデコードし、1 つおきのフレームのみを画面にレンダリングすることでこれを実現できます。ただし、特に任意の値で再生を増やしたい場合は、これは優れた解決策とは思えません。たとえば、10x の速度では、コーデックは 30 fps で 10 フレームごとに再生するのに十分な速さでフレームをデコードできません。
代わりに、MediaExtractor.advance() を複数回呼び出して再生を制御し、デコードする必要のないフレームをスキップしたいと思います。例えば:
このコードでは、理論上、エクストラクタはn 番目のフレームごとにのみ抽出する必要があります。ここで、nは変数「playbackSpeedIncrease」によって定義されます。たとえば、n = 5 の場合、これはフレーム 1 ~ 4 を過ぎて進み、フレーム 5 のみを抽出する必要があります。
ただし、これは実際には機能しません。このコードを実行すると、画面にレンダリングされた画像が歪んでいます。
これがなぜなのか誰か知っていますか?任意の速度でビデオを再生するためのより良い方法について何か提案はありますか?
android - MediaExtractor を使用してビデオの特定の部分を抽出する
Android で処理するために、事前に記録されたビデオ ファイルの一部を使用しようとしています。現在、Android で MediaCodec ライブラリを使用しています。MediaExtractor を使用して、ビデオ ファイルからデータを抽出しています。アイデアは、処理に必要な gata ストリームのみを抽出することです。コードは次のようになります。
Logcat は次のとおりです。
java.io.IOException: エクストラクタのインスタンス化に失敗しました。android.media.MediaExtractor.setDataSource(ネイティブ メソッド) で。
開始バイトを 0 に設定するとうまくいきます。何が間違っていますか? mediaextractor を使用して動画の一部を抽出することはできませんか?