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 はビットレートの指定をやめました。指定すると絵の具が下に流れるようなノイズが時々入ります。ビットレートを指定しなければ、画質はよくありませんが変なノイズは入りません。
ディスカッション
コメント一覧
まだ、コメントがありません