Gstreamer(1)

Gstreamer をインストールして、USB-HDMI ドングルから取り込んでみます。

インストール

$ sudo apt-get install libgstreamer1.0-dev \ libgstreamer-plugins-base1.0-dev \ gstreamer1.0-tools libgtk2.0-dev \ gstreamer1.0-omx gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-good

とりあえず、上記をインストールしました。

OpenMX を使えるか確認

$ gst-inspect-1.0 | grep omx omx: omxh264enc: OpenMAX H.264 Video Encoder omx: omxvc1dec: OpenMAX WMV Video Decoder omx: omxmjpegdec: OpenMAX MJPEG Video Decoder omx: omxvp8dec: OpenMAX VP8 Video Decoder omx: omxtheoradec: OpenMAX Theora Video Decoder omx: omxh264dec: OpenMAX H.264 Video Decoder omx: omxh263dec: OpenMAX H.263 Video Decoder omx: omxmpeg4videodec: OpenMAX MPEG4 Video Decoder omx: omxmpeg2videodec: OpenMAX MPEG2 Video Decoder

 OpenOMX はハードウェアを使ったエンコード/デコードできるので、Raspberry Pi のような低スペックの CPU では、使えないと取り込みが難しくなります。

取り込んで見る

$ gst-launch-1.0 v4l2src device=/dev/video0 ! \ image/jpeg,width=640,height=480,framerate=30/1 ! \ jpegdec ! videoconvert ! ximagesink

 取り込んだ動画を表示します。次は録画してみます。

$ timeout 120 gst-launch-1.0 -v v4l2src ! videorate ! \ image/jpeg,framerate=30/1 ! jpegdec ! \ clockoverlay ! omxh264enc ! h264parse !\ mpegtsmux ! filesink location=test.ts

 二分間の録画ができました。

音声も含めて録画する

 alsa を使うので、インストールします。

$ udo apt-get install gstreamer1.0-alsa $ gst-launch-1.0 -v v4l2src ! videorate ! \ image/jpeg,framerate=30/1 ! jpegdec ! \ omxh264enc target-bitrate=1000000 control-rate=variable ! \ video/x-h264,profile=high ! h264parse ! queue ! \ mpegtsmux name=mux alsasrc device=plughw:2 ! \ audioresample ! audio/x-raw,rate=48000,size=8192 ! \ queue ! voaacenc bitrate=32000 ! queue ! \ mux. mux. ! filesink location=test.ts

 できました。mp4 で出力しようとしましたが、mp4mux ではエラーになってしまったので ts で出力しました。出力したファイルをチェックしてみます。

$ fprobe test.ts Input #0, mpegts, from 'test.ts': Duration: 00:01:59.63, start: 3600.000000, bitrate: 155 kb/s Program 1 Stream #0:0[0x41]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p(progressive), 1920x1080, 30 tbr, 90k tbn, 180k tbc Stream #0:1[0x42](en): Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 31 kb/s

映像と音声をプレビューする

$ gst-launch-1.0 -v v4l2src device=/dev/video0 ! \ image/jpeg,width=1280,height=720,framerate=30/1 ! \ jpegdec ! videoconvert ! \ ximagesink alsasrc device=plughw:2 ! \ audioresample ! audio/x-raw,rate=48000 ! \ audioconvert ! autoaudiosink

一つのストリームを複数のエレメントに渡す

 tee を使ううと複数のエレメントに渡すことができるようです。プレビューと保存の両方を同時に行います。

$ gst-launch-1.0 -v v4l2src device=/dev/video0 ! \ videorate ! \ image/jpeg,width=1280,height=720,framerate=30/1 ! \ jpegdec ! tee name=v \ v. ! queue ! videoconvert ! \ videoscale ! video/x-raw,width=640 ! ximagesink \ v. ! queue ! omxh264enc ! \ video/x-h264,profile=high ! h264parse ! queue ! \ mpegtsmux name=mux alsasrc device=plughw:2 ! \ audioresample ! \ audio/x-raw,rate=4800annel=2,size=16384 ! tee name=a \ a. ! queue ! audioconvert ! autoaudiosink \ a. ! queue ! \ voaacenc bitrate=128000 ! queue ! \ mux. mux. ! filesink location=test.ts

 できました。けれど長いです。

 入力は 1280×720 でエンコードはそのままの解像度で、プレビューは 640×360 に縮小して表示しました。また、omxh264enc はビットレートの指定をやめました。指定すると絵の具が下に流れるようなノイズが時々入ります。ビットレートを指定しなければ、画質はよくありませんが変なノイズは入りません。

Gstreamer

Posted by sirius