Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ruby で ffmpeg の filter_complex と戯れる話

819 views

Published on

Ruby で ffmpeg の filter_complex と戯れる話

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Ruby で ffmpeg の filter_complex と戯れる話

  1. 1. Ruby で ffmpeg の filter_complex と戯れる話 OPEN8 Inc. スタートアップテック vol.1: Ruby LT大会 2018.11.29
  2. 2. 自己紹介 名前 : 川島 嘉一 会社 : OPEN8 Inc. 部署 : テクノロジー開発本部 インフラ・データ基盤部 経歴 : Web系のインストラクター -> ECパッケージの受託開発 -> 現在 インフラとか管理してそうな部に所属はしてるけど、 コードも書くし、CTOの雑用も手伝うし、なんでもやる
  3. 3. 弊社に必須のツール
  4. 4. 弊社に必須のツール ffmpeg
  5. 5. ffmpeg の実際に使うコマンド /usr/bin/ffmpeg -y -r 15 -i /opt/shared/revisions/revision1/sources/out_param/w_%d.bmp - i ./assets/input/overlay.png -i ./assets/input/soundless.mp3 -i ./assets/input/soundless.mp3 - i ./assets/input/soundless.mp3 -filter_complex "[0:v]fps=fps=15[img]; [img][1:v]overlay=x=0:y=0[img]; [2:a]atrim=duration=4.2,asetpts=PTS-STARTPTS[2a]; [3:a]atrim=duration=5,asetpts=PTS-STARTPTS[3a]; [4:a]atrim=duration=5.5,asetpts=PTS- STARTPTS[4a]; [2a][3a][4a]concat=n=3:v=0:a=1[CONCAT_AUDIO]" -map [img] -map [CONCAT_AUDIO] -s 1920x1080 -crf 22 -movflags faststart -vcodec libx264 -pix_fmt yuv420p -strict -2 -c:a aac -ac 2 -progress - /opt/shared/revisions/revision1/outputs/output.mp4
  6. 6. ffmpeg の実際に使うコマンド /usr/bin/ffmpeg -y -r 15 -i /opt/shared/revisions/revision1/sources/out_param/w_%d.bmp - i ./assets/input/overlay.png -i ./assets/input/soundless.mp3 -i ./assets/input/soundless.mp3 - i ./assets/input/soundless.mp3 -filter_complex "[0:v]fps=fps=15[img]; [img][1:v]overlay=x=0:y=0[img]; [2:a]atrim=duration=4.2,asetpts=PTS-STARTPTS[2a]; [3:a]atrim=duration=5,asetpts=PTS-STARTPTS[3a]; [4:a]atrim=duration=5.5,asetpts=PTS- STARTPTS[4a]; [2a][3a][4a]concat=n=3:v=0:a=1[CONCAT_AUDIO]" -map [img] -map [CONCAT_AUDIO] -s 1920x1080 -crf 22 -movflags faststart -vcodec libx264 -pix_fmt yuv420p -strict -2 -c:a aac -ac 2 -progress - /opt/shared/revisions/revision1/outputs/output.mp4
  7. 7. 話の流れ 1. filter_complex 2. どのように実装したか 3. 今後やっていきたいこと
  8. 8. 話の流れ 1. filter_complex 2. どのように実装したか 3. 今後やっていきたいこと
  9. 9. filter_complex ● 複雑な処理を一度に行うためのオプション ● filter, filter_chain, filter_graph の3つの要素で構成されている
  10. 10. filter 1. "[0:v]fps=fps=15[img];[1:a]atrim=duration=20,afade=type=out:start_time=20:duration=0.0[OA1]" 2. "[0:v]fps=fps=15[img];[1:a]atrim=duration=20,afade=type=out:start_time=20:duration=0.0[OA1]" 3. "[0:v]fps=fps=15[img];[1:a]atrim=duration=20,afade=type=out:start_time=20:duration=0.0[OA1]" filter
  11. 11. filter_chain 1. "[0:v]fps=fps=15[img];[1:a]atrim=duration=20,afade=type=out:start_time=20:duration=0.0[OA1]" 2. "[0:v]fps=fps=15[img];[1:a]atrim=duration=20,afade=type=out:start_time=20:duration=0.0[OA1]" 3. "[0:v]fps=fps=15[img];[1:a]atrim=duration=20,afade=type=out:start_time=20:duration=0.0[OA1]" filter_chain
  12. 12. filter_graph 1. "[0:v]fps=fps=15[img];[1:a]atrim=duration=20,afade=type=out:start_time=20:duration=0.0[OA1]" 2. "[0:v]fps=fps=15[img];[1:a]atrim=duration=20,afade=type=out:start_time=20:duration=0.0[OA1]" 3. "[0:v]fps=fps=15[img];[1:a]atrim=duration=20,afade=type=out:start_time=20:duration=0.0[OA1]" filter_graph
  13. 13. filter_complex filter filter_chain filter_graph filter filter filter_chain filter
  14. 14. 本日のアジェンダ 1. filter_complex 2. どのように実装したか 3. 今後やっていきたいこと
  15. 15. どのように実装したか ● filter class ● filter chain class ( N filters ) ● filter_graph class ( N filter_chains ( N filters ))
  16. 16. どのように実装したか ● 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
  17. 17. どのように実装したか ● 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 それぞれの責務を明確に切り分ける!
  18. 18. filter class
  19. 19. filter_chain class
  20. 20. filter_graph class
  21. 21. どのように実装したか filter_graph_list [.....] filter_chain_list [......] filter_list [.....] xx.join
  22. 22. ffmpeg の実際に使うコマンド /usr/bin/ffmpeg -y -r 15 -i /opt/shared/revisions/revision1/sources/out_param/w_%d.bmp - i ./assets/input/overlay.png -i ./assets/input/soundless.mp3 -i ./assets/input/soundless.mp3 - i ./assets/input/soundless.mp3 -filter_complex "[0:v]fps=fps=15[img]; [img][1:v]overlay=x=0:y=0[img]; [2:a]atrim=duration=4.2,asetpts=PTS-STARTPTS[2a]; [3:a]atrim=duration=5,asetpts=PTS-STARTPTS[3a]; [4:a]atrim=duration=5.5,asetpts=PTS- STARTPTS[4a]; [2a][3a][4a]concat=n=3:v=0:a=1[CONCAT_AUDIO]" -map [img] -map [CONCAT_AUDIO] -s 1920x1080 -crf 22 -movflags faststart -vcodec libx264 -pix_fmt yuv420p -strict -2 -c:a aac -ac 2 -progress - /opt/shared/revisions/revision1/outputs/output.mp4
  23. 23. 話の流れ 1. filter_complex 2. どのように実装したか 3. 今後やっていきたいこと
  24. 24. 今後やっていきたいこと プロダクト開発初期は、開発スピードに重点を置いていたので、 Rubyを選択した. しかし、型のvalidation を設定したいので、 強い型付けの言語にしたい.
  25. 25. ffmpeg 用の gem の紹介 ● ある ● streamio-ffmpeg ( https://github.com/streamio/streamio-ffmpeg) ● ffmpeg の ラッパー ● 本格的にffmpeg 使いたい時には物足りない ● 基本的に 1 つの素材を想定して作っている
  26. 26. イケてない箇所
  27. 27. エンジニア募集中です! Rubyだけじゃなく、iOS, Androidエンジニアも募集! 詳しくは懇談会ででも!

×