bmdcapture の取得データで配信する

avconvとWebカメラでHLS(HTTP Live Streaming)配信を行う

でやったことを応用して、今度は bmdtoolsを利用してHDMI入力を配信する。 最終的に用いることになるコマンドはこちら

$ sudo sh -c "bmdcapture -C 0 -m 9 -F nut -V 3 -A 2 -c 2 -s 16 \
-o strict=experimental:syncpoints=none -f pipe:1 \
| avconv -f nut -vsync passthrough  -i pipe:0  \
-ac 2 -ar 48000 \
-vf \"crop=640:480:100:100\" \
-vcodec libx264 -preset ultrafast -b:v 512000 \
-acodec libfdk_aac -b:a 256000 \
-f hls -hls_list_size 10 -hls_time 10 ./out.m3u8"

元になったコマンドはこの投稿

Got it!

The Mini Recorder shoots at 10 bits rather than 8 (which I assumed considering Adobe’s live encoder said it would be 8).

Here is the fixed code:

./bmdcapture -m 14 -p yuv10 -C 0 -F nut -f pipe:1 \
| avconv -vsync passthrough -y -i - -vcodec copy -pix_fmt uyvy422 -strict experimental \
-f hls -hls_list_size 999 +live -strict experimental out.m3u8

bmdcaptureからHDMI入力を取得する

bmdcapture -C 0 -m 9 -F nut -V 3 -A 2 -c 2 -s 16 -o strict=experimental:syncpoints=none -f pipe:1

0番目のblackmagic製デバイスからHDMIで映像と音声(2ch/16bit)を、1080p30 形式で取得している。 出力はavconvに渡すためにpipeを用いている。

詳しくはbmdtools: bmdcaptureの使い方 参照。

avconvの設定

基本的な使い方は avconvの使い方 参照、HLS(HTTP Live Streaming)配信に利用する引数やコーデックに関しては avconvとWebカメラでHLS(HTTP Live Streaming)配信を行う を参照のこと。

入力設定

-f nut -vsync passthrough  -i pipe:0 -ac 2 -ar 48000

nut形式の入力、受け取り口はpipe:0、ステレオ48000kHzのサンプリングレートで取得している。

##17.10 pipe

UNIX pipe access protocol.

Allow to read and write from UNIX pipes.

The accepted syntax is:

pipe:[number]

number is the number corresponding to the file descriptor of the pipe (e.g. 0 for stdin, 1 for stdout, 2 for stderr). If number is not specified, by default the stdout file descriptor will be used for writing, stdin for reading.

For example to read from stdin with avconv:

cat test.wav | avconv -i pipe:0
# ...this is the same as...
cat test.wav | avconv -i pipe:

For writing to stdout with avconv:

avconv -i test.wav -f avi pipe:1 | cat > test.avi
# ...this is the same as...
avconv -i test.wav -f avi pipe: | cat > test.avi

必要部分の切り抜き

-vf "crop=640:480:100:100"

必要な部分だけ、cropフィルタを用いて切り抜いている。

映像圧縮方法の設定

-vcodec libx264 -preset ultrafast -b:v 512000

x264で圧縮する。プリセットはultrfast、ビットレートは512kbpsとした。

音声圧縮方法の設定

-acodec libfdk_aac -b:a 256000

fdk-aacで圧縮する。ビットレートは256kbps

HLSの設定

-f hls -hls_list_size 10 -hls_time 10 ./out.m3u8

HLSで出力する。プレイリストファイルはout.m3u8、 動画ファイルはout[n].tsリストには最大10個の動画ファイル、1つの動画ファイルの時間は10秒。

avconvがsudoしても一般ユーザ権限で実行されてしまう

権限の問題で/var/www/htmlにエンコードしたファイルとプレイリストが出力できなかった(書き込み権限がない)。

avconvまで含めて管理者権限で実行するために

sudo sh -c "実行内容"

としている。実行内容をダブルクォートで囲む必要があるため、 ビデオフィルタを指定する際のダブルクォートをエスケープしている。

MANに書いてある.

困って、Manを読んだらManに書いてあった.SudoのMan最高

/home パーティションにあるディレクトリのディスク使用量リストを作成する。 cd とファイルリダイレクションが動作するように、サブシェルでコマンドを実行している点に注意すること。

% sudo sh -c "cd /home ; du -s * │ sort -rn > USAGE"

つまりsudoでsh を起動してねってことらしい

sudo sh -c "do_something > /etc/fstab.d/foo"

出来た.

実行結果

最終的なコマンドはこのようになった。

$ sudo sh -c "bmdcapture -C 0 -m 9 -F nut -V 3 -A 2 -c 2 -s 16 \
-o strict=experimental:syncpoints=none -f pipe:1 \
| avconv -f nut -vsync passthrough  -i pipe:0  \
-ac 2 -ar 48000 \
-vf \"crop=640:480:100:100\" \
-vcodec libx264 -preset ultrafast -b:v 512000 \
-acodec libfdk_aac -b:a 256000 \
-f hls -hls_list_size 10 -hls_time 10 ./out.m3u8"

これを /var/www/html で実行し、他のコンピュータからアクセスして表示されるか検証する。

ちゃんと表示されれば成功。