問題タブ [libavformat]
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.
c++ - libavformat を使用した RTP 経由の H.264 ストリーミング
先週、RTP 経由で H.264 ストリーミングを実装しようと試みました。x264 をエンコーダとして使用し、libavformat を使用してストリームをパックして送信しました。問題は、私が知る限り、正しく機能していないことです。
現在、ランダム データ (x264_picture_alloc) をエンコードし、libx264 から NAL フレームを抽出しています。これはかなり単純です。
nal_queue
フレームを安全に Streamer クラスに渡し、フレームを送信するために使用されます。これを機能させるためにテストしているだけなので、現在はスレッド化されていません。個々のフレームをエンコードする前に、エンコーダーを確実に初期化しました。
しかし、x264 が問題であるとは思いません。返される NAL でフレーム データを確認できるからです。データのストリーミングは、Streamer クラスで最初に初期化される libavformat で実現されます。
これは、物事がうまくいかないように見えるところです。av_write_header
上記はまったく何もしないようです。これを確認するためにwiresharkを使用しました。参考までに、以前に x264 を処理するために使用されたオブジェクトへの参照を使用Streamer streamer(&enc, "10.89.6.3", 49990, 800, 600, 30, 40000);
して、Streamer インスタンスを初期化します。enc
Encoder
NALをストリーミングしたいときは、これを使用します:
この時点で、RTP データがネットワーク上に表示されていることがわかります。これまで送信してきたフレームのように見えます。x264 からの小さな著作権の塊も含まれています。しかし、私が使用したプレーヤーは、データの意味を理解できませんでした. VLC は SDP の説明を必要としなくなりますが、これは明らかに必須ではありません。
私はそれからそれを再生しようとしましたgst-launch
:
gst-launch udpsrc port=49990 ! rtph264depay ! decodebin ! xvimagesink
これはUDPデータを待っていますが、受信すると次のようになります:
エラー: 要素 /GstPipeline:pipeline0/GstRtpH264Depay:rtph264depay0: RTP 形式がネゴシエートされませんでした。追加のデバッグ情報: gstbasertpdepayload.c(372): gst_base_rtp_depayload_chain (): /GstPipeline:pipeline0/GstRtpH264Depay:rtph264depay0: 入力バッファーには RTP キャップを設定する必要があります。これは通常、上流のソース要素 (多くの場合、udpsrc または appsrc) の「caps」プロパティを設定するか、depayloader の前に capsfilter 要素を配置して「caps」プロパティを設定することによって実現されます。http://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/gst/rtp/READMEも参照して ください。
私は GStreamer を使用してストリーミングしていないので、RTP キャップでそれが何を意味するのかよくわかりません。しかし、RTP でストリームを説明するのに十分な情報を送信していないのではないかと思います。私はビデオにかなり慣れていないので、ここで欠けている重要なものがあるように感じます. ヒントはありますか?
ffmpeg - libavformat から TS パケットをバッファに取得します
ビデオをキャプチャして圧縮し、mpeg2 ts として多重化したいと思います。これはすべて、ffmpeg ライブラリを使用すると非常に簡単ですが、ファイルに書き込む代わりに、ts パケットをバッファーにキャプチャし、このストリームを他の方法で使用することをお勧めします。これを行う簡単な方法はありますか?
エンコードされたフレームを今すぐファイルに書き込むには、av_interleaved_write_frame(oc, &pkt) を使用します。OC は、ファイル名とフォーマットが定義された出力コンテキストです。pkt は、圧縮されたフレームを含む AVPacket です。av_interlaced_write_frame は、ファイルの多重化と書き込みを行っています。
私が最終的に達成したいのは、同じ ts ストリームを複数のファイルに書き込み、互いに独立して異なるファイルの書き込みを開始および停止することです。ストリームごとに新しいマルチプレクサを開始するのは効率が悪いように思われます。TS ストリームは正しく再生されるためにヘッダーや正しいエンディングを必要としないためです (私が読んだものが正しい場合)。
私は ffmpeg コードで良い例を見つけようとして途方に暮れており、ライブラリは十分に文書化されていません。この件に関するご意見をお待ちしております。ありがとうございました!
h.264 - ffmpegを使用してH.264でエンコードされたデータをファイルに保存する
フレームグラバーからのH264データがあります。このデータを使用して、RTP/H264 ストリーミング サーバー (live555 を使用) と RTP/H264 クライアント (ffmpeg と live555 を使用) を既に作成しています。
サーバーに新しい機能を追加したい : エンコードされた H264 データを任意の形式 (avi、mp4、mkv など) で (トランスコードせずに) ファイルに直接保存し、後で VLC を使用してビデオを視聴できるようにします。
表示クライアントについては、基本的に、次のことを実行しました。
1) ffmpeg/av_new_packet() を使用して H264 データからパケットを構築します
2) H264 データのデコード ffmpeg/avcodec_decode_video2()
3) ffmpeg/sws_scale() を使用してデコードされたフレームをフォーマットする
4) ディスプレイ
データをデコード/トランスコードせずに ffmpeg を使用せずに、動画ファイルの保存機能についてすぐに教えてもらえますか? で十分です
1) 出力コンテキスト (形式) を選択します
2) ffmpeg/av_new_packet() を使用して H264 データからパケットを構築します
3) ffmpeg/av_(interleaved)_write_frame() (および av_write_trailer() と av_write_header()) を使用してパケットを保存しますか?
?
みんなありがとう
c++ - ffmpegを使用して.MP4にエンコードする際の問題
ですから、私はこれに少し慣れていません。ビデオを.AVIに記録するWIN32アプリを作成していて、ffmpegを使用して.MP4にエンコードすることを計画しました。私が見つけたサンプルに基づいて、私はここまで到達しました。コンパイルしてファイルをエンコードして書き込んだと表示されますが、出力ファイルを開いて再生することはできません。元のサンプルが使用していたようにMPEG1エンコーディングを使用してみましたが、数秒間だけ奇妙な色が表示されます。
ファイルで実行する必要がある何かが不足していますか?
エンコーディング/ffmpegの経験、いくつかのポインタ、アドバイス、またはヘルプを持っている人は、私を最も感謝しています。前もって感謝します!
c++ - Visual Studio 2010 での libavformat のリンク
libavformat を中心にビデオ読み取りコードを作成しようとしています。ここでコンパイル済みの DLL と.lib
ファイルを取得した後、コードをビルドします。提供されたファイルをリンクしても、リンカは libavformat シンボルを見つけることができません 。.lib
で調べるlibavformat.lib
とdumpbin -headers
、アンダースコアの接頭辞が付いた目的の関数がエクスポートされていることがわかります。たとえば、 を呼び出したいのですavformat_open_input
が、.lib ファイルは_avformat_open_input
.
これはなぜですか? また、プリコンパイル済みの dll をリンクできないのはなぜですか?
c - av_find_stream_infoは、パイプではなくファイルで問題なく機能します
私は次のコードを持っています:
入力が通常のファイルの場合、これはうまく機能し、pFormatCtxにはファイル内のストリームが入力されます。ただし、入力を「pipe:」に設定すると、av_find_stream_infoは-1で返されます。
同じファイルを使用して、実行してパイプします
cat mpeg.ts | myApp
何か案は?
ありがとう、アリザ
c++ - C/C++ の Linux で libavcodec を使用するとエラーが発生する
問題: AVFormatContext::nb_streams の値が小さすぎます。私のC++コード(リストを減らすために省略されたエラー処理、インクルードなど):
ランニング:
しかし、「avplay」プログラムはうまく機能します。
encoding - sws_scaleは、小さいx264mp4エンコーディングで最後のピクセル行を台無しにします
PIX_FMT_ARGB形式の画像をmp4ビデオに多重化しています。
送信画像の最後のピクセル行がめちゃくちゃになっていることを除いて、すべてうまく機能します。ほとんどの場合、最後の行は完全に黒で、他の色がある場合もありますが、それが実行されているマシンに何らかの形で依存しているようです。
スケーリングの前後に画像を保存しているので、エラーはsws_scaleにあるはずです。入力画像にエラーはありませんが、sws_scale()の後で、yuv画像を保存すると、エラーが明らかになります。
次に例を示します。
オリジナル
Yuvfile(sws_scaleの後)
Yuvfileの下部に、黒い行が表示されます。
これは私がスケーリングを行う方法です(それは公式のffmpegの例の後です、多かれ少なかれ):
また、いくつかの異なるSWS_フラグを試しましたが、すべて同じ結果になります。
これはsws_scaleのバグでしょうか、それとも何か間違ったことをしていますか?ffmpegライブラリの最新バージョンを使用しています。
c - libavformat/ffmpegをx264およびRTPと同期する際の問題
私は、H.264を使用して、さまざまな種類のカメラからライブフィードを取得し、ネットワーク経由でストリーミングするストリーミングソフトウェアに取り組んできました。これを実現するために、x264エンコーダーを直接(「zerolatency」プリセットを使用して)使用し、libavformatでRTP(最終的にはRTSP)にパックできるNALをフィードしています。理想的には、このアプリケーションは可能な限りリアルタイムである必要があります。ほとんどの場合、これはうまく機能しています。
ただし、残念ながら、ある種の同期の問題があります。クライアントでのビデオ再生では、いくつかのスムーズなフレームが表示され、その後に短い一時停止が続き、さらに多くのフレームが表示されます。繰り返す。さらに、約4秒の遅延があるようです。これは、私が試したすべてのビデオプレーヤー(トーテム、VLC、基本的なgstreamerパイプ)で発生します。
私はそれをやや小さなテストケースにまとめました:
このテストでは、白い背景に黒い線が表示され、左にスムーズに移動するはずです。ffmpeg 0.6.5用に書かれていますが、問題は0.8と0.10で再現できます(これまでにテストしたものから)。エラー処理でいくつかのショートカットを使用して、この例をできるだけ短くし、問題を示しているので、厄介なコードのいくつかを許してください。また、ここではSDPを使用していませんが、SDPを使用してみたところ、同様の結果が得られていることにも注意してください。テストは次のコマンドでコンパイルできます。
gtreamerで直接再生できます。
吃音にすぐに気付くはずです。私がインターネット全体で見た一般的な「修正」の1つは、パイプラインにsync=falseを追加することです。
これにより、再生がスムーズに(そしてほぼリアルタイムで)行われますが、解決策ではなく、gstreamerでのみ機能します。ソースで問題を修正したいと思います。私は生のffmpegを使用してほぼ同一のパラメーターでストリーミングすることができましたが、問題はありませんでした。
だから明らかに私は何か間違ったことをしている。しかし、それは何ですか?
ffmpeg - ffmpeg ライブラリを使用してテキスト字幕を抽出する
私は ffmpeg の libav* ライブラリを使用する C プログラムを作成しており、ドレンジャーのチュートリアルを使用して、オーディオとビデオの両方を正しくデコードできます。現在、字幕を抽出しようとしています。私は実際にそれらを時間通りにデコードしてビデオに表示したくありませんが、実際にはコンテナーから字幕テキストを抽出します。
たとえば、cli では、
お尻のファイルを返してくれます。(何らかの理由で、srts はテキストのみを返します。)
AVSubtitle、avcodec_decode_subtitle2 などをいじってみましたが、字幕が 1 行ずつ返されます。srts のタイムコード、ass のヘッダー情報などが必要です。必要なのは、コンテナーに多重化された字幕テキスト ファイル全体だけです。