こんにちは、インフラ・データ基盤部の川島です。最近寒くなってきましたね。今年も終わりますね。心はすでに年末休みです。
先日、エンジニア交流イベント「スタートアップテック vol.1」を開催しました。
今回のテーマは、みんなが大好きな「Ruby」です。弊社のプロダクトもほとんど全てと言ってもいいくらいRubyを使っています。 主催枠として、私もLTを行ったので、発表内容を紹介できればと思います。
発表内容
LTのテーマは、「Rubyとffmpegのfilter_complex」について発表しました。オープンエイトのプロダクト全てが動画をベースに展開しているため、Rubyと同じく、全てのプロダクトでffmpegを使っています。最近のプロジェクトの中でのffmpegを活用した実装事例について紹介しました。
ffmpeg は動画や音声に対して、非常に多くのことができる優秀なツールです。基本的にコマンドラインで操作を行うため、多くのオプションを設定しなければいけません。
下記のコマンドが実際に使用したものになります。
ffmpeg -y -r 15 \ -i ./image/%d.jpg -i 01.mp3 -i 02.mp3 \ -filter_complex "[0:v]fps=fps=15[img];[1:a]atrim=duration=20.0,afade=type=out:start_time=19.0:duration=1.0,asetpts=PTS-STARTPTS[OA1]; [OA1]amerge=inputs=1[a]" \ -map [img] -map [a] -s 640x360 -crf 30 -movflags faststart -vcodec libx264 -pix_fmt yuv420p -q:a 0 -strict -2 \ output.mp4
プロジェクトの中では、このコマンドを Ruby で生成しています。 LTの中では、複数あるオプションの中でも、 filter_complex 部分に焦点を絞って紹介しました。
filter_complexは大きく3つの構成に分類することができます。
- filter
- filter_chain
- filter_graph
fps=fps=15 # filter [0:v]fps=fps=15[img] # filter_chain "[0:v]fps=fps=15[img];...." # filter_grpah
filter_graph[filter_chian[filter]]
という形でそれぞれが内包されているイメージです。
コードで実装する場合にも、この構成を元にクラス定義していきます。
filter class filter_chain class ( N filters ) filter_graph class ( N filter_chains ( N filters ))
対象のディレクトリの構成としては下記になります。
- filter_complex │ └──-filter │ │ xx_filter.rb │ └───filter_chain │ │ xx_chain.rb │ └───filter_graph │ xx_graph.rb
名前空間、filter毎のクラスで分けることによって、それぞれのfilterの責務を明確にすることができます。また、追加したいfilterがあったとしても、filter, filter_chain, filter_graph をセットで追加することで、容易に作成ができます。
まとめ
ffmpegは、本当にたくさんのことができるツールです。この記事でffmpeg、特にfilter_complex に興味を持っていただけるとうれしいです。
次回のイベント告知
1/29(火)にも、弊社主催のLT大会を行なっていきます。次回のテーマは「フロント」です。 また、「一緒に勉強会を行いたい!」などのご要望がありましたら、ぜひご連絡(@hisatake)をお待ちしております!
おまけ
コードなどの内容は下記のスライドに掲載してあります。
www.slideshare.net