問題タブ [android-mediacodec]
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 - 約 1 秒のレイテンシでリアルタイムに h264 ストリームをデコードする Android メディアコーデック
Galaxy S3のmadiacodecによってWIFIカメラからのh264ライブストリームをデコードしようとしています.ビデオは正常に再生されますが、メディアコードの低レベルは常にビデオフレームの1秒をバッファリングするようです.新しいフレームは新しい着信NALユニットによってのみデコードできます. . これにより、約 1 秒の遅延が発生します。
がMediaCodec.createDecoderByType("video/avc");
呼び出されると、logcat から 22 個のバッファーが割り当てられていることがわかります。
また、フレームを出力する前に、約 16 個の NAL ユニットをデコーダーにプッシュする必要があることがわかります。
私の質問は、なぜこのビデオのバッファリングですか? それが問題である場合、私はより少ないバッファを割り当てることを試みることができます。とにかく、このビデオのバッファリングを減らすことができますか?
android - Androidでは、エンコードのために事前定義されたSurfaceをMediaCodecに渡す方法は?
独自の GLSurfaceView を管理するアプリがあり、Surface を入力として受け取る Android 4.3 の新しい MediaCodec 機能を使用したいと考えています。
私が見たすべての例では、Surface は MediaCodec.createInputSurface() を使用して作成され、次にこの Surface の GL コンテキストが作成されます。これはモノリシックで、すでに安定しているコード ベースに後付けするのは信じられないほど破壊的だと感じます。
代わりに MediaCodec.configure(format, a_predefined_Surface, null, MediaCodec.CONFIGURE_FLAG_ENCODE) を使用することは可能ですか? これにより、プラグ アンド プレイおよびオンデマンドの方法で MediaCodec を使用できます。MediaCodec.configure() が Surface パラメーターを取るという事実は、これが可能であることを示しています。ただし、API には、「このデコーダーの出力をレンダリングするサーフェスを指定してください」と記載されています http://developer.android.com/reference/android/media/MediaCodec.html#configure(android.media.MediaFormat , android. view.Surface, android.media.MediaCrypto, int) は、これはデコードのみを目的としており、エンコードは意図していないことを意味しますか?. もしそうなら、MediaCodec がエンコードに定義済みの Surface を使用するようにする方法はありますか?
私が渡しているサーフェスは、EGL_RECORDABLE_ANDROID が true に設定された状態で既に作成されており、返された GL コンテキストには、必要な EGL_RECORDABLE_ANDROID 属性が含まれていることが確認されています。それにもかかわらず、MediaCodec.configure() は役に立たない例外「native_window_api_connect がエラーを返しました: 無効な引数 (-22)」で失敗します。
これは、Android 4.3 を搭載した Samsung Galaxy S4 のものです。
android - SurfaceComposerClient からスクリーンショットを取得する
MediaCodec が createInputSurface() で行うように、SurfaceComposerClient を使用してスクリーンショットを取得することは可能ですか。
エンコードされたデータではなく生のビデオが必要なので、そのために MediaCodec を使用することはできません。
4.3 以降、ScreenshotClient は複数のスクリーンショットを作成できないようです。
android - オーディオとビデオの両方を多重化できません
MediaCodec を使用して画面キャプチャとオーディオを記録するアプリを作成しています。MediaMuxer を使用してビデオとオーディオを多重化し、mp4 ファイルを作成します。ビデオとオーディオを別々に書き込むことに成功しましたが、それらをライブで一緒に多重化しようとすると、予期しない結果になります。ビデオなしでオーディオが再生されるか、オーディオの直後にビデオが再生されます。タイムスタンプに何か問題があると思いますが、正確にはわかりません。私はすでにこれらの例を見てきました: https://github.com/OnlyInAmerica/HWEncoderExperiments/tree/audiotest/HWEncoderExperiments/src/main/java/net/openwatch/hwencoderexperimentsと bigflake.com のものを見つけることができませんでした答え。
これが私のメディア形式の構成です:
オーディオおよびビデオ エンコーダー、マルチプレクサー:
これを使用して、ビデオのタイムスタンプを設定します。
そして、これはオーディオタイムスタンプを設定するためのものです:
「timestampUs XXX < lastTimestampUs XXX」を回避するために、この例https://github.com/OnlyInAmerica/HWEncoderExperiments/blob/audiotest/HWEncoderExperiments/src/main/java/net/openwatch/hwencoderexperiments/AudioEncodingTest.javaから取得しました。エラー
誰かが問題を解決するのを手伝ってくれますか?
android - MediaExtractor の問題
MediaExtractor
と を使用して、特定の時間に特定のフレームを映画から画像として取得しようとしていますMediaCodec
。次の場合、正常に実行できます。
- 私は を使用
extractor.seekTo(time, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);
しますが、これはターゲット フレームではなく、最も近い同期フレームのみを提供します。 - を使用してすべてのフレームを順次抽出します
extractor.advance();
が、すべてではなくターゲット フレームを取得する必要があります。
だから、私は次のことを試します:
これにより正しいフレームが提供されますが、何らかの理由で画像が破損しています。それは正しい画像 (私が成功したケースから得たもの) のように見えますが、ピクセル化と奇妙なかすみがあります。
成功したケースと破損したケースで異なるのwhile-loop
は、これだけです。MediaExtractor
破損したイメージを取得せずに特定の時間 (同期時間だけでなく)に進むにはどうすればよいですか?