問題タブ [mpeg2-ts]
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.
ffmpeg - MP4 をメモリ内の MPEG-2 TS に変換するための Java ライブラリ?
それで...
Media クラス (ライブ ストリーミングではなく、ビデオ オン デマンド) を使用してビデオを再生するために、組み込みの HTTP ライブ ストリーミング サーバーを実行する Java FX アプリケーションがあります。ビデオの再生は、RTP パケットのコレクションを実際に格納している複数のファイルで構成されます。ファイル (.m3u8 インデックス ファイル内のエントリ) の取得要求を処理するために HttpHandler が呼び出されるとき、私は次のことを計画しています...
- ファイルをメモリにロードする
- RAW H264 パケットのバイト配列の作成
- RAW H264をMPEG-2 TSに変換(ラップ?)します(ffmpeg -i video.h264 video.ts)
- 再生できるように、MPEG-2 TS コンテンツをレスポンス ボディに書き込みます。
...私の要件の 1 つは、一時ファイルであっても、ローカル ファイルを作成できないことです。そのため、.h264 ファイルを作成できず、ffmpeg を使用して .ts ファイルを作成し、ts ファイルを読み取ってから、内容を応答本文に書き込みます。
私が知る限り、Xuggler はストリームでは動作せず、JCodec は遅いです。MPEG-2 TS フォーマットを掘り下げて理解し、RAW H264 を適切なフォーマットに単純に変換できるとかなり確信していますが、これは以前に行われるべきであった多くの不必要な作業のように思えます。
RAW H264 を MPEG-2 TS に変換する簡単な方法を知っている人はいますか? それともMP4からMPEG-2 TSへ?MP4Parser を使用してメモリ内に MP4 データをすばやく作成できます。必要なのは、MPEG-2 TS データを生成できる Java ライブラリだけです。ありがとう!
ffmpeg - H.264 Annex B を MPEG-TS に変換する
それで...
RTSP 経由でローカル ファイルにキャプチャした RAW H.264 ビデオ データがあり、そのビデオを Java FX アプリケーションで再生しようとしています。これを行うには、HTTP ライブ ストリーミングを使用する必要があります。
.m3u8 (HLS インデックス) ファイルと .ts (MPEG-TS) ファイルのコレクションを含むローカル フォルダーを使用して、ローカル サーバーで HLS 経由でビデオを再生できる Java FX アーキテクチャのプロトタイプを作成することに成功しました。私にとって最後の作業は、.ts ファイルを .264 / .h264 ファイルに置き換え、ローカル サーバーで H.264 Annex B データの MPEG-TS への変換 / ラッピングを実行することです。
H.264 Annex B を MPEG-TS に変換するために必要なものがわかりません。以下の情報を見つけました...
「Annex B は、トランスポート ストリームなどのライブおよびストリーミング形式で一般的に使用されます...」
szatmary.org/blog/25
「ドキュメントの付属書 B は、従来の MPEG ビデオ エレメンタリ ストリームに似た形式で NAL ユニットをラップするそのような形式の 1 つを指定しているため、必要なフレーミングを提供できない MPEG PS/TS などのコンテナーでの使用に適しています...」
wiki.multimedia.cx/?title=H.264
「Java FX はさまざまなメディア タイプをサポートしています。メディア タイプは、コンテナ形式と 1 つ以上のエンコーディングの組み合わせと見なされます。場合によっては、コンテナ形式は、エンコードされたデータを含む単純なエレメンタリ ストリームである可能性があります。」
docs.oracle.com/javafx/2/api/javafx/scene/media/package-summary.html
「EXT-X-STREAM-INF タグの CODECS 属性を使用します。この属性が存在する場合、ストリームの再生に必要なすべてのコーデックとプロファイルを含める必要があります...」
developer.apple.com/library/ios/documentation/networkinginternet/conceptual/streamingmediaguide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html
エレメンタリー ストリームとトランスポート ストリームの周りに単純なものが欠けているようです。ffmpeg を使用して H.264 ファイルを TS ファイルに変換し、違いを理解しようとしました。おおよそのフォーマットの違いについてはわかっていますが、それを行うための詳細はまだ不足しています。これを紹介するリンクを持っている人、または MPEG-TS 経由で H.264 Annex B データを提供する方法について簡単なことを知っている人はいますか?
ツールを使用するつもりはありません。H.264 Annex B データを解析し、その場でメモリ内のフォーマット変更を実行するカスタム ファイル フォーマットをローカルに用意する必要があります。これを達成するためにパイプで ffmpeg を使用する方法を知っていますが、依存関係を持ちたくないので、パフォーマンスが重要です。
mpeg2-ts - アサーション位置 >= 188 mpeg ts
mpegts.c ( libavformat ) の関数handle_packet()
で、188 より小さい正の値の位置を取得しました。これにより、アサーション エラーが発生しました。この問題の理由と解決策を教えてください。
frame - トランスポート ストリーム標準
トランスポート ストリームの適切な標準を知りたいのですが、私の疑問のいくつかは次のとおりです。
- PES パケットのサイズが > 65536 の場合、フィールドは
pes_packet_length
ゼロにする必要がありますか? - PES パケット サイズが 65536 を超える場合、オーバー フロー パケットに PES ヘッダーが必要ですか?
android - mpeg2 ts アンドロイド ffmpeg openmax
セットアップは次のとおりです。
- マルチキャスト サーバー 1000Mbs、UDP、Mpeg2-TS Part 1 (H.222) ストリーミング ライブ TV チャンネル。
- クアッドコア 1.5Ghz Android 4.2.2 GLES 2.0 レンダラー。
- FFMpeg ライブラリ。
- Eclipse Kepler、Android SDK/NDK など。Windows 8.1 上で動作します。
- 出力画面 1920 x 1080、2048 x 1024 のテクスチャを使用し、毎秒 35 ~ 45 フレームを取得しています。
アプリ:
- レンダラー スレッドは継続的に実行され、メディア イメージの準備ができたときに GPU にセグメントをアップロードすることで単一のテクスチャを更新します。
- メディア ハンドラー スレッドは、サーバー/ローカル ストレージからメディアをダウンロードして処理します。
- UDP パケットをバッファリングするためのビデオ スレッドと、パケットをフレームにデコードするためのビデオ スレッド。
ffmpeg を UDP ストリームに正常に接続しており、パケットはバッファリングされ、一見正常にデコードされています。パケット バッファは十分にあり、アンダー/オーバーフローはありません。私が直面している問題は、フレームを切り刻んでいるように見えることです (つまり、非常に多くのフレームのうち 1 つだけを再生しています)。I/P/B フレームを区別する必要があることは理解していますが、現時点では手がかりがありません。Iフレームを検出するためにハックを試みましたが、役に立ちませんでした。さらに、フレームを画面の 4 分の 1 未満にレンダリングするだけです。だから私は全画面デコードを使用していません。
デコードされたフレームは、ページのティアリングをカットするために別のバッファーにも格納されます。私が変更したバッファの数も、1 から 10 に変更しましたが、うまくいきませんでした。
OpenMax IL について私が見つけたところによると、それは MPEG2-TS Part 3 (H.264 および AAC) のみを処理しますが、独自のデコーダーを使用できます。独自のデコード コンポーネントを追加できることを理解しています。このルートを試す価値はありますか、それともffmpegを続行する必要がありますか?
フレーム デコーダー (レンダラーのみが準備が整ったときにフレームを変換およびスケーリングします) /* * この関数はパケットを処理し、* フレームの準備が整うまで、またはパケットがなくなるまでデコードを続けます */
パケット リーダー (pthread として生成) void *mainPacketReader(void *voidptr) { int res;
レンダラーは単にこれを行うだけです // テクスチャはこの関数を呼び出す前に既にバインドされています
過去には、libvlc にもオーディオ同期の問題があったため、ffmpeg を使用してすべてのロバ作業をゼロから行うことにしました。
ビデオ再生の途切れを止める方法(VLCプレーヤーでうまく機能する)、またはおそらく別の方法でダウンする方法についての指針があれば、真剣に感謝します。
EDIT Iフレームのハックを削除しました(まったく役に立たない)。sws_scale 関数をレンダラーからパケット デコーダーに移動します。そして、udp パケット リーダー スレッドはそのままにしました。
その間に、パケット リーダー スレッドとパケット デコーダ スレッドの優先度をリアルタイムに変更しました。それを行ってから、ドロップされたパケットが大量に流されることはありません。
video - ffmpeg と live555 の違い
との主な違いを知っている人はいますlive555
かffmpeg
。どちらもビデオストリーミングができるようです。トランスポートストリームで行うのですlive555
がRTSP
、で行うffmpeg
のですか?mpeg-2
ありがとう、ラン