PT2で録画したデータはATOMでなく、クラウド側でエンコードしたら速いよね。ATOMでエンコードすると、時間がかかりすぎるし、電気代大変なので。
サーバーでエンコードする。
cat test.ts | ssh enc_server1 "/usr/local/bin/ffmpeg -i pipe:0 out.mp4 "
はい、楽チン。
これで転送待ち時間がゼロです。転送しながら到着した動画をエンコードするのです。
仕組みの解説。
標準入力をつかったエンコード
cat test.mpeg | /usr/local/bin/ffmpeg -i pipe:0 out.mp4
これで、FFMPEGが、標準入力のパケットをそのままエンコードして、out.mp4に書き出します。
- pipe0 :0 が標準入力
- pipe1 :1 が標準出力
- pipe2 :2 がエラ出力
- pipe :- 指定なしは自動判別
です。
無名パイプライン処理に、ffmpegを挟み込む
最後にこれらに、ffmpegをはさみ込めば完成です。
cat test.ts | ssh enc_server1 "/usr/local/bin/ffmpeg -i pipe:0 out.mp4 “
転送待ちして、その後にTSを変換するとか時間無駄だし。そもそもTSってこういう使い方しても大丈夫なトランスポートストリームなんだからね。
転送も、エンコードも同時にするなら
teeをはさみ込めばいいんじゃないかな
cat test.ts | ssh enc_server1 "|tee test.ts | /usr/local/bin/ffmpeg -i pipe:0 out.mp4 “
これでどう?
標準入力が使えるんなら
EPGRECで録画時にそのままmp4で保存できるんじゃないかと思ってるんだけどさ。
ffmpeg のパイプ出力に注意
ffmpeg -i pipe:0 -vcodec libx264 -acodec copy -f mp4 pipe:1
は出来ない。標準出力に出すには、当然TSで有るべきだと思う。
別にTSでなくてもいいんだけど、MP4だと、動画の書き込みのために、ファイルの中身をSEEKで戻ったりする。
なので、Mp4のpipe出力はffmpegに怒られて、動作しないの。パイプだと行きつ戻りつができないので無理だそうだ。
で注意が必要。
ffmpeg -i pipe:0 -vcodec libx264 -acodec copy -f mpegts pipe:1
だと動くかも。
ファイル転送して、そのまま別サーバーにってことも
cat test.ts | ssh enc_server1 "|tee test.ts | /usr/local/bin/ffmpeg -i pipe:0 - (....エンコ設定...)| ssh storage-server " cat - > /path/to/out.mp4"
こんな豪快なことしてLANケーブルを帯域で占拠しても、ストレージ鯖とエンコード鯖で役割分担できますね。Gigabit LAN だから意外とできちゃうからオモシロイ