問題タブ [muxer]
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.
open-source - Java でのオープン ソース mp4 マルチプレクサ
利用可能なオープン ソースの MP4 マルチプレクサ/ライター Java プロジェクト (Java で記述されたソース、ネイティブ コードなし) はありますか?
H.264 と AAC の raw/elementary ストリームを別々のファイルに保存しています。それらを多重化し、オーディオとビデオの両方を含む .mp4 ビデオ ファイルを取得したいと考えています。
貴重なご提案をいただきありがとうございます。
android - Android 4.1以降のMP4ファイルライター
Android 4.1 (API レベル 16) 以降、MediaCodec API が導入されました。これらの API は、エレメンタリ ストリームのデコードとエンコードをサポートします。また、MediaExtractor API は、メディア ストリームを分析することにより、基本的なトラックの詳細を提供します。
私の質問は、.h264 形式でエンコードされたファイルを提供する MediaCodec API を使用してビデオ エンコーダーをセットアップすることです。再生/保存/共有の目的で、.h264 ファイルを .mp4 ファイルに書き込みたいと考えています。Android用の.MP4ファイルライターAPIが見つかりません。それを達成する方法はありますか?
ありがとう、サティシュ。
ffmpeg - libavformat を使用して同じコーデックで 2 つのビデオ ファイルを連結する (再多重化) 方法は?
CDN からビデオを flv 形式 (ビデオ H264 およびオーディオ AAC) でダウンロードし、MP4 形式に再多重化しました。ただし、動画の長さには制限があります。そのため、各ビデオをいくつかの部分に分けてダウンロードしました。開始点、ポイント 1、ポイント 2 (URL のシーク パラメータを使用) で開始しました。各ポイントは、前のポイントの終わりより少し早く始まります。
iを使用av_read_frame
してすべての部分をスキャンしたところ、交差するパケットのサイズと順序が同じであるだけでなく、それらの dts/pts が定数値だけ互いにずれていることがわかりました。したがって、開始ビデオをポイント 1 で開始されたビデオと連結するには、次のことを行う必要があります。
1. 出力ファイルに出力ヘッダーを作成します
。 2. 交差しないすべてのパケットを開始ビデオからコピーします。
3. ポイント 1 で開始されたビデオから、dts 値を定数でシフトして変更されたすべての交差しないパケットをコピーします。
libav (ffmpeg ではない) を使用してこれらすべてを行うには? How can libavformat be used without using other libav librariesを読みました。しかし、libav
そこにないので、それは機能していませavformat_alloc_output_context2
んlibav
。また、ソースavconv.c
ソースは複雑すぎて、私のような初心者には、ストリーム コピー操作に関連する部分を分離できません。- input_file1と
input_file2を
開く(一般的なチュートリアルで手順が標準と異なる場合にのみ必要) -同じコンテナー形式と同じビデオおよびオーディオ形式でoutput_file
のヘッダーを開いて書き込む- input_file1からoutput_fileに
パケットを書き込む
たとえば、パケットまで-input_file2からoutput_filepos == XXX
に
パケットを書き込み、dts(または必要なもの)を定数値で変更します
-正しく書き込みますtrailer
前に作成した dts でのタイム シフトの計算。
android-4.3-jelly-bean - 入力が Surface のメディア コーデック API が H264 エンコーダーで動作しない (bigflake サンプル コード)
bigflakeの次のリンクで説明されている4.3でH264エンコーダーを使用してMedia Codec APIのサンプルコードを実行しようとしています
http://bigflake.com/mediacodec/CameraToMpegTest.java.txt
次の問題に直面しました。-> H264 エンコーダ コードでは、getpatameter の実装に問題があるため、カラー フォーマット、高さ、および幅が更新されません。そこで、このパッチを適用しました ( https://code.google.com/p/android/issues/detail?id=58834 )。-> パッチを適用した後、エンコーダーもエンコードしません -> D/CameraToMpegTest( 3421): エンコーダーの出力形式が変更されました: {csd-1=java.nio.ByteArrayBuffer[position=0,limit=8 、容量=8]、高さ=144、mime=ビデオ/avc、csd-0=java.nio.ByteArrayBuffer[位置=0、制限=12、容量=12]、何=1869968451、幅=176}
なぜこの値が変更されるのか、わかりません...その後、エンコーダーが queueOutputBuffer のステータスを INFO_TRY_AGAIN_LATER として与えるのを常に確認します。したがって、ファイルを作成しますが、何もエンコードせず、次のように停止します
I/MPEG4Writer( 3421): 合計/長さ 0 (0/0) のバッファーを受信し、0 フレームをエンコードしました。- ビデオ
D/MPEG4Writer( 3421): ビデオ トラックを停止しています
D/MPEG4Writer( 3421): ビデオトラックソースを停止しています
D/MPEG4Writer( 3421): ビデオ トラックが停止しました
D/MPEG4Writer( 3421): ライター スレッドを停止しています
D/MPEG4Writer( 3421): 最後のバッチで 0 チャンクが書き込まれました
D/MPEG4Writer( 3421): ライター スレッドが停止しました
したがって、私の理解では動作するはずですが、エンコーダがまだ正しく構成されていないようです...
これについてガイドしてください...ありがとう
ネハル
android - Android MediaMuxer illegalstateexception がマルチプレクサ mMediaMuxer.stop() を停止できませんでした
MediaMuxer の停止に問題があります。
私がオーディオを使用していることを除いて、 fadden の例にかなり従ったので、オーディオとビデオのトラックがまだ 100% 揃っているかどうかはわかりません。これが問題かもしれません。
mMediaMuxer.stop() のブレークポイントに到達すると、致命的なエラーが発生します。
stop を呼び出すと、MediaMuxer.mState = MUXER_STATE_INITIALIZED を伝えるのに十分な距離まで踏み込むことができます。しかし、nativeStart(mNativeObject) で失敗しています...
android - MediaMuxer エラー「マルチプレクサを停止できませんでした」
MIME タイプ "video/avc" をCamera
使用してプレビュー データをエンコードし、エンコードされたデータ (ビデオのみ、オーディオなし) を に渡します。マルチプレクサは正常に動作しているようで、適切なサイズの出力ファイルを作成します (つまり、記録が長くなるほど大きくなります)。ただし、マルチプレクサを停止しようとすると、「マルチプレクサを停止できませんでした」というエラーが表示されます。MediaCodec
MediaMuxer
失敗した停止の前に、いくつかの疑わしい MPEG4Writer ログ メッセージがあります。
これを引き起こしている手がかりはありますか?さらに必要な情報がわからない。
android - Android 4.1/4.2 デバイスでエンコーダーに MediaCodec.getOutputFormat() を使用する際の問題
MediaCodec を使用して、(カメラまたはデコーダーによって) フレームをビデオにエンコードしようとしています。dequeueOutputBuffer() によってエンコーダー出力を処理するとき、戻りインデックス = MediaCodec.INFO_OUTPUT_FORMAT_CHANGED を受け取ることが期待されるため、getOutputFormat() を呼び出して、現在使用されている ffmpeg マルチプレクサーの入力としてエンコーダー出力形式を取得できます。
Android バージョン 4.1 ~ 4.3 でいくつかのパッド/電話デバイスをテストしました。それらはすべて、少なくとも 1 つのハードウェア ビデオ AVC エンコーダーを備えており、テストで使用されます。バージョン 4.3 のデバイスでは、エンコーダーはエンコードされたデータを期待どおりに書き込む前に MediaCodec.INFO_OUTPUT_FORMAT_CHANGED を提供し、getOutputFormat() から返された出力形式をマルチプレクサーで正しく使用できます。4.2.2 以前のデバイスでは、エンコーダーは MediaCodec.INFO_OUTPUT_FORMAT_CHANGED を提供しませんが、エンコードされたエレメンタリー ストリームを出力できますが、マルチプレクサは正確な出力形式を認識できません。
次の質問をしたいです。
- エンコーダーの動作 (エンコードされたデータを出力する前に MediaCodec.INFO_OUTPUT_FORMAT_CHANGED を与えるかどうか) は、Android API レベルまたは個々のデバイスのチップに依存しますか?
- MediaCodec.INFO_OUTPUT_FORMAT_CHANGED が表示される前にエンコーダーがデータを書き込む場合、エンコードされたデータの出力形式を取得する方法はありますか?
- エンコーダーは、エンコードされたデータの前に、デバイスのコーデック構成データ (フラグ MediaCodec.BUFFER_FLAG_CODEC_CONFIG を使用) を引き続き出力します。主にデコーダーの構成に使用されますが、コーデック構成データから出力形式を導き出すことはできますか?
出力形式を取得するためにこれらのソリューションを試しましたが、失敗しました:
- エンコード プロセス全体で頻繁に getOutputFormat() を呼び出します。ただし、それらはすべて、MediaCodec.INFO_OUTPUT_FORMAT_CHANGED を表示せずに IllegalStateException をスローします。
例のように、最初の MediaFormat の使用を使用して、最初にエンコーダーを構成します。
ただし、エンコーダーの出力形式がまだ最初のものから「変更」されているため、失敗します。
エンコーダーの動作を理解するのを手伝ってください。必要な MediaCodec.INFO_OUTPUT_FORMAT_CHANGED が欠落している場合、出力形式を照会する解決策があれば教えてください。
出力形式とコーデック構成データを比較すると、欠落しているフィールドは csd-0、csd-1、および値 = 1869968451 の「what」フィールドです。 (「what」フィールドはわかりません。定数であり、必須ではありません. 誰かがその意味について教えてもらえますか?)
コーデック構成データを csd-1 フィールド (最後の 8 バイト) および csd-0 フィールド (残りのバイト) として解析すると、マルチプレクサは正しく動作し、すべてのテスト デバイスで再生可能なビデオを出力できるようです。(しかし、私は質問したい: この 8 バイトの仮定は正しいですか、それともデータを解析するためのより信頼できる方法はありますか?)
しかし、もう一度 Android MediaCodec でビデオをデコードすると、dequeueOutputBuffer() で取得される BufferInfo.presentationTimeUs の値が、デコードされたフレームのほとんどで 0 になるという別の問題が発生しました。最後の数フレームだけが正しい時間です。MediaExtractor.getSampleTime() で取得したサンプル時間は正しく、エンコーダー/マルチプレクサーに設定した値とまったく同じですが、デコードされたフレーム時間は異なります。この問題は、4.2.2 以前のデバイスでのみ発生します。
フレーム時間が正しくないのは奇妙ですが、ビデオはデバイスで正しい速度で再生できます。(私がテストした 4.2.2 以前のほとんどのデバイスには、ビデオ AVC デコーダーが 1 つしかありません。) プレゼンテーション時間に影響を与える可能性のある他のフィールドを設定する必要がありますか?