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 -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の使い方 参照、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
-f hls -hls_list_size 10 -hls_time 10 ./out.m3u8
HLSで出力する。プレイリストファイルはout.m3u8
、
動画ファイルはout[n].ts
リストには最大10個の動画ファイル、1つの動画ファイルの時間は10秒。
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 で実行し、他のコンピュータからアクセスして表示されるか検証する。