「スタートアップテック vol.1」を開催しました!

https://connpass-tokyo.s3.amazonaws.com/thumbs/87/36/87360719e01f4b0d089645f47e2f7d45.png

こんにちは、インフラ・データ基盤部の川島です。最近寒くなってきましたね。今年も終わりますね。心はすでに年末休みです。

先日、エンジニア交流イベント「スタートアップテック vol.1」を開催しました。

今回のテーマは、みんなが大好きな「Ruby」です。弊社のプロダクトもほとんど全てと言ってもいいくらいRubyを使っています。 主催枠として、私もLTを行ったので、発表内容を紹介できればと思います。

発表内容

LTのテーマは、「Rubyffmpegの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