はじめに
- 「Pepper のカメラ映像をライブ配信する実験」の続きです。
- 若干ですが前進し、条件付きでは実現できそうな予感がします。ただ、まだまだ理想の形には遠い状態です。
案1 HTTP Live Streaming (HLS) を使用
案1-1 Pepper 内に FFmpeg がインストールされているならば、それを使用してインデックスファイル(.m3u8)とセグメントファイル(.ts)を生成できるのではないか (続き)
前回の後、「そういえば -f video4linux2 のオプションをつけていたら結果は違っただろうか」と思ったところがあり、今回、オプションをいろいろ試してみました。結論としては概ね以下の通り。
- 以下のコマンドで Pepper 内蔵の ffmpeg を使用して /dev/video0 からの入力を動画ファイル化できる。
$ ffmpeg -f video4linux2 -s 320x240 -r 10 -i /dev/video0 -pix_fmt yuv420p video.mp4
-
ただ、残念ながらバージョンが古く、HTTP Live Streaming のためのセグメンタ機能は入っていないよう。
-
-f segment -segment_* 等のオプションをつけて実行すると、コマンドは失敗し、Pepper との接続が切れてしまう。 さらに Pepper は再起動するしないと、再度接続できなくなる っぽい。
ということで、Pepper の ffmpeg のみでは HLS での配信は無理そうです。
案1-2 Pepper 内蔵の FFmpeg で動画ファイルを生成し、別マシンの新しいバージョンの FFmpeg のセグメンタ機能でインデックスファイル(.m3u8)とセグメントファイル(.ts)を生成する
-
- 案1-1 のコマンドだと1動画ファイルの容量が増加し続けるので、録画時間のオプション(-t)を追加で指定します。
$ ffmpeg -f video4linux2 -s 320x240 -r 10 -i /dev/video0 -pix_fmt yuv420p -t 15 video.mp4
-
- 別マシンに生成した動画ファイルをコピーします。
-
- 別マシンの新しい ffmpeg で HLS のファイルを生成します。
$ ffmpeg -i video.mp4 -f segment -segment_format mpegts -segment_time 5 segment-list video.m3u8 video%04d.ts
$ ls -la video*
-rw-r--r-- 1 suna staff 201 1 31 18:06 video.m3u8
-rw-r--r-- 1 suna staff 566197 1 31 18:02 video.mp4
-rw-r--r-- 1 suna staff 296100 1 31 18:06 video0000.ts
-rw-r--r-- 1 suna staff 205860 1 31 18:06 video0001.ts
-rw-r--r-- 1 suna staff 116560 1 31 18:06 video0002.ts
-
- 以下のような HTML を作成して、動画を再生します。
<html>
<head>
<title>HLS test</title>
</head>
<body>
<video src="./video.m3u8" controls>
</body>
</html>
この流れで PC で動画の再生が確認できました。1〜4 を繰り返せばカメラ映像が表示できそうです。
ただ、Pepper と別マシンで 2 回 ffmpeg を通さないといけないのと、中間ファイルを作らないといけないのは、どうにも無駄に感じます。
案1-3 (未確認) Pepper 内蔵の FFmpeg で動画データを取得し、パイプを通して、別マシンの新しいバージョンの FFmpeg のセグメンタ機能でインデックスファイル(.m3u8)とセグメントファイル(.ts)を生成する
まずは中間ファイルを作らないようにするため、パイプを通すのはどうでしょう。
別マシン側から以下のようなコマンドを実行します。
$ ssh nao@IP_Address "ffmpeg -f video4linux2 -s 320x240 -r 10 -i /dev/video0 -pix_fmt yuv420p -f mp4 pipe:1" | ffmpeg -f segment -segment_format mpegts -segment_time 5 segment-list video.m3u8 video%04d.ts
このコマンドは未確認なのですが、こちら「ffmpegを応用する。ファイル転送しながら、エンコード」の情報によると、mp4 のパイプはダメそうな感じがします。
案1-4 (未確認) Pepper 内蔵の FFmpeg で動画データを取得し、生データ・あるいはパイプ可能なデータ形式でパイプを通して、別マシンの新しいバージョンの FFmpeg のセグメンタ機能でインデックスファイル(.m3u8)とセグメントファイル(.ts)を生成する
これも未確認ですが、何となくいけそうな予感がします。
次のアトリエ秋葉原の開発タッチ&トライに参加したときに試してきます。
次回へ続く。
感想
- やはり手元に Pepper 実機がないと、思うように進みませんねぇ。