web-dev-qa-db-ja.com

gstreamerを介してRTSPビデオストリームをMP4ファイルに保存する方法は?

カメラからRTSP経由でビデオストリームを取得し、ファイルに保存する必要があります。これはすべて、gstreamerを介して行う必要があります。

いくつかのグーグル検索の後、私は以下を試しました:

gst-launch-1.0 rtspsrc location=rtsp://192.168.1.184/live2.sdp ! queue ! rtph264depay ! avdec_h264 ! mp4mux ! filesink location=result3.mp4

しかし、それはエラーを与えます:「誤ったパイプライン:avdec_h264-0をmp4mux0にリンクできませんでした」

gst-launch-1.0 rtspsrc location=rtsp://192.168.1.184/live2.sdp ! queue ! rtph264depay ! h264parse ! mp4mux ! filesink location=result3.mp4

作業を開始しますが、結果ファイルはVLC経由で再生できません。

行うべき正しいコマンドは何ですか?また、h264parseとavdec_h264のどちらかを選択した場合、その理由を説明していただけますか?

10
Juster

Mp4muxがファイルをファイナライズできるように、-eフラグ(ストリームの終わり)を追加する必要があります。そうしないと、再生できないファイルが破損します。

 gst-launch -e rtspsrc location=url ! decodebin ! x264enc ! mp4mux ! filesink location=file.mp4
15
Haris Kovacevic

2番目のコマンドは正しいように見えます。生のh264ビデオデータには、「配置」と「ストリーム形式」という2つの特性があり、変化する可能性があるため、少し注意が必要です。 h264parseは、h264データをさまざまなh264関連のGStreamer要素に必要な形式に変換できます。

avdec_h264はデコーダー要素です。どうやらデータを表示していないので、データをデコードしたくありません。エンコードされたh264データをRTSPストリームからmp4コンテナファイルに入れています。

ファイルが再生されない場合は、ストリームが良好であることを確認するか、他のメディアプレーヤーを試して、それらが機能するかどうかを確認する必要があります(mplayer、Media Player、Quicktimeなど)。

「matroskamux」要素を使用して、matroskaコンテナファイルに多重化することもできます。

7
mpr

RtspsrcストリームがすでにH264でエンコードされている場合は、コーデックプロセスを実行する代わりに、mp4コンテナに直接書き込むだけです。

Rtspをmp4に記録するためのgst-launch-1.0コマンドは次のとおりです。

$ gst-launch-1.0 -e rtspsrc location=rtsp://admin:[email protected]/rtsph2641080p protocols=tcp ! rtph264depay ! h264parse ! mp4mux ! filesink location=~/camera.mp4

幅、高さ(videoscaleを使用)、色空間(videoconvertを使用)、フレームレート(capsfilterを使用)などを変更する場合は、video/x-rawタイプの機能に基づいて行う必要があり、ビデオからデコードする必要があります。/x-h264からvideo/x-rawへ。

また、変更後、mux要素(mp4mux、mpegtsmux、matroskamuxなど)にリンクする前に、再度エンコードする必要があります。

ビデオデコーダーをいつ使用するかわからないようです。ここでは、ビデオコーデックの使用経験を簡単に共有します。

  1. ソースがエンコードされていて、同じエンコードでコンテナーに書き込みたい場合、パイプラインは次のようになります。

    src ! ... ! mux ! filesink

  2. ソースがエンコードされていて、別のエンコードでコンテナーに書き込みたい場合、またはビデオシンクで再生したい場合、パイプラインは次のようになります。

    src ! decode ! ... ! encode ! mux ! filesink src ! decode ! ... ! videosink

  3. ソースがエンコードされておらず(videotestsrcのように)、コンテナーに書き込みたい場合、パイプラインは次のようになります。

    src ! encode ! mux ! filesink

注:コーデックを実行すると、CPUリソースが高くなります!したがって、コーデックの作業を行う必要がない場合は、それを行わないでください。

便利なツールgst-inspect-1.を使用して、src、sink、mux、demux、enc、dec、convert、...などの要素をチェックアウトできます。例えば:

$ gst-inspect-1.0 | grep mux

使用可能なすべてのマルチプレクサ要素を表示します。

3
eric_hsu