web-dev-qa-db-ja.com

gstreamerを使用してウェブカメラからの多重化されていない画像/ jpegストリームを修正する

次のパイプラインを使用して壊れた映像を作成しました。

_gst-launch-1.0 v4l2src ! filesink location=encode.mjpeg
_

どういうわけかgstreamerはまだそれを再生することができます:

_gst-launch-1.0 filesrc location=encode.mjpeg ! jpegdec ! videoconvert ! xvimagesink
_

ただし、誤ってコンテナを使用しなかったため、ストリームは非常に速いペースで再生されますframerate=(fraction)0/1。壊れたファイルを再圧縮せずに_.avi_または他のコンテナに変換する方法はありますか?

次の些細な多重化は期待どおりに機能しませんでした。

_gst-launch-1.0 filesrc location=encode.mjpeg \
    ! 'image/jpeg,framerate=30/1,width=1280,height=720' ! avimux \
    ! filesink location=encode.avi . -v
_

どういうわけか、gstreamerはかなりのCPUを消費することなく、約1 FPSで非常にゆっくりと_encode.avi_を再生します。また、Vlc`もAdobe AfterEffectsもインポートできません。正しくデコードされた、最初のフレームのストライプのみが上部に表示されます。

1
nponeccop

Aviへのmuxingで発生している問題は、filesrcがmjpegフレームに適切に配置されていないバッファをavimuxに提供しているため、avimuxが内部で間違った配置のサンプルを作成しているため、プレーヤーがそれらを使用しにくくなっていることに関連しています。後で再生中に。

これは、capsfilter(jpegparse?)の後にmjpegパーサーを使用することで修正できます。もう1つのオプションは、サンプルをデコードおよび再エンコードして、サンプルを適切に整列および多重化することです。次のパイプラインが機能するはずです。

gst-launch-1.0 filesrc location=encode.mjpeg \
! 'image/jpeg,framerate=30/1,width=1280,height=720' ! decodebin ! videoconvert ! \
<some encoder> ! <some muxer> ! filesink location=outputfile

エンコーダーとマルチプレクサーを好きなように選択できます。最初に必要に応じて、それらをjpegにエンコードし、muxをaviにエンコードすることもできます。

編集:デコードせずにコンテンツをaviに多重化するには、次のようにします。

gst-launch-1.0 filesrc location=encode.mjpeg \
    ! 'image/jpeg,framerate=30/1,width=1280,height=720' ! jpegparse ! avimux \
    ! filesink location=encode.avi . -v

Jpegparseが非常にうまく機能する場合は、「image/jpeg、framerate = 30/1、width = 1280、height = 720」は必要ありません。

1
thiagoss