ffmpegでwebcamを入力に使う方法
ふと、某動画ストリーミングサイトの開発に携わりながら、動画投稿は経験があるが生放送の経験がないのは問題ではないかと思い、自腹でwebcamを買ってみた。今回買ったのはRazer KIYO PROだ。このwebcamはUSB 3.0で接続し、カメラとマイクがあり、1080p 60fpsまで対応しているらしい。
普通の人ならば、これをつないで使うだけなのだろうが、筆者の環境はGNU/Linuxだ。はたして動くのだろうか。
とりあえずつなぎ、Webcamを使うソフトウェアCheeseで確認したところ、正常に動作することを確認した。ではさっそく競合他社のYouTubeで生放送をしてみよう。
FirefoxでYouTubeの生放送の配信ページを開き、webcamから配信をしようとしたが、ただしいwebcamを認識しない。筆者の使うラップトップには、内蔵のカメラとマイクもついているのだ。
しかたなくOBS Studioで配信をしようとapt install obs-studioしたが、なぜか起動しない。
本当に仕方がないのでffmpegを使って配信することにした。
GNU/Linuxでwebcamの動画を入力するにはv4l2(video4linux2)を使う。
まず、
$ v4l2-ctl --list-devices
Razer Kiyo Pro (usb-0000:00:14.0-1):
/dev/video2
/dev/video3
/dev/media1
Integrated_Webcam_HD: Integrate (usb-0000:00:14.0-12):
/dev/video0
/dev/video1
/dev/media0
これをみると、Razer Kiyo Proは/dev/video2かvideo3のようだ。ffprobeで対応するフォーマットについて調べてみる。
$ ffprobe -hide_banner -f v4l2 -list_formats all -i /dev/video2
[video4linux2,v4l2 @ 0x55f3756a92c0] Raw : yuyv422 : YUYV 4:2:2 : 640x480 640x360 1280x720 1920x1080
[video4linux2,v4l2 @ 0x55f3756a92c0] Compressed: mjpeg : Motion-JPEG : 640x480 640x360 1280x720 1920x1080
[video4linux2,v4l2 @ 0x55f3756a92c0] Compressed: h264 : H.264 : 640x480 640x360 1280x720 1920x1080
[video4linux2,v4l2 @ 0x55f3756a92c0] Raw : nv12 : Y/CbCr 4:2:0 : 640x480 640x360 1280x720 1920x1080
/dev/video2: Immediate exit requested
$ ffprobe -hide_banner -f v4l2 -list_formats all -i /dev/video3
[video4linux2,v4l2 @ 0x557d3c53f2c0] ioctl(VIDIOC_G_INPUT): Inappropriate ioctl for device
/dev/video3: Inappropriate ioctl for device
どうやら/dev/video2が正しいらしい。Razer Kiyo Proは生データのキャプチャーの他に、H.264ハードウェアエンコードにも対応しているらしい。
ffmpegを使ってRazer Kiyo ProからH.264エンコードされた1920x1080 60fps動画をファイルに保存するには以下のようにする。
$ ffmpeg -f v4l2 -input_format h264 -video_size 1920x1080 -framerate 60 -i /dev/video2 -c copy captured.mkv
Razer Kiyo Proのマイクをffmpegの入力に使うにはALSAを使う。まず現在存在する入力ソースを列挙する。
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC3266 Analog [ALC3266 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: Pro [Razer Kiyo Pro], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
どうやらcard 1がRazer Kiyo Proのようだ。音声のエンコードは軽いので非力なラップトップでもリアルタイムエンコードできる。
ffmpegを使ってRazer Kiyo Proのマイク入力をaacにエンコードしてファイルに出力するには以下のようにする。
$ ffmpeg -f alsa -i hw:1 -acodec aac captured.mkv
ffmpegでRazer Kiyo Proから動画と音声を取得できるようになったので、あとはこれをYouTubeのrtmp URLに流し込んでやればいいだけだ。
$ ffmpeg -f v4l2 -input_format h264 -video_size 1920x1080 -framerate 60 -i /dev/video2 -f alsa -i hw:1 -vcodec copy -acodec aac -f flv rtmp://URL/key
これで生放送配信ができるようになった。
さくっと書いているが、これを調べて実験するのに1時間はかかっている。なるほど、生放送配信とは面倒だな。