それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ffmpegを応用する。ファイル転送しながら、エンコード

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 :- 指定なしは自動判別

です。

ファイル転送

cat test.ts | ssh enc_server1 "cat - > out.ts “

SSHは、標準入力・出力を扱えるので、それをつかって標準入力をそのまま渡します。

無名パイプライン処理に、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 だから意外とできちゃうからオモシロイ


SSHで標準入力を渡す」は便利

こいうのは便利だと思うわ。そういえば、知り合いがサーバー越しにパイプをするために、わざわざnetcatやら、ポートあけて待受しててたな。
SSH使えよって思います。

SSHでパイプをネットワークで使えるのに、そして名前付きパイプでもいいと思うんだけど。