Raspberry Pi ffmpegを学習する(MP4)

raspbianもstretchからffmpegが復活しています。

ffmpegの使い方については多くのサイトで解説があります。
ffmpegには多くのoptionがあり使い方も多岐に渡るためごく一部だけですが当サイトもweb上のサイトを参照して学習してみたいと思います。

教材を調達する

やはり勉強するからにはなにか教材があったほうがいいですね。
調達するためのツールは前回インストールしたyoutube-dlを使用することとします。

ダウンロードの是非については自己判断、自己責任に委ねるものとします。

ピンも言っています。 ”自分でなんとかしろ!

最低限のお約束としてはプライベートの利用に限ることだと思います。

「君届」 (crop)

教材としてこの動画をダウンロードしてみました。

$ youtube-dl -f mp4 "http://www.youtube.com/watch?v=FFgA1_jOH5M"
or
$ youtube-dl -f mp4 "https://youtu.be/FFgA1_jOH5M"


背景の画像が・・・・
動画の部分だけ抜き出してみたいと思います。

ダウンロードしたファイルをffmpegに喰わせてみます

$ ffmpeg -i "Kimi ni todoke Cap 01 _Prologo_ - Sub. Español-FFgA1_jOH5M.mp4"

これから少し読み取れるのは

Duration: 00:20:35.65
Video: h264 1280×720
Audio: aac
ほかのパラメータは理解していません

参考サイト
FFmpeg > クロップ-領域を指定して動画出力

crop

$ ffmpeg -y -t 0:03 -vsync 1 -i "Kimi ni todoke Cap 01 _Prologo_ - Sub. Español-FFgA1_jOH5M.mp4" -vf crop=713:430:150:127 kimitodo-01.mp4

元サイス 1280×720
713:430 動画サイズ(X,Y)
150:127 切り出し開始位置(X,Y)
最初に目星を付けて開始位置を指定します。動画サイズは実サイズより小さい値を指定しておきます(画面からはみ出すような値を指定すると開始位置がずれる)
開始位置が決まったら動画サイズを合わせていきます。
ffmpeg -y -t 0:03 上書き保存、最初から3秒間実行してstop

切り取り確認は自動で終了しないffplayで再生します。
うまく切り取りができたら通しで実行しますがこの動画は最後の20秒ほど本編とは関係のない映像が入っているのでカットします。

$ ffmpeg -y -ss 0 -t 20:15 -vsync 1 -i "Kimi ni todoke Cap 01 _Prologo_ - Sub. Español-FFgA1_jOH5M.mp4" -vf crop=713:430:150:127 kimitodo-01.mp4

最初の3秒カットしたい場合は -ss 3 として -t 20:12 とします。

Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (aac (native) -> aac (native))

speed=0.766x 非力なPi3では20分の動画に対して25〜30分くらいかかります。

713×430のサイズで取り出すことができました。
位置出し、サイズ合わせは慣れるまで少々根気が必要です。

「君嘘」 (concat)

君嘘は大変悲しい物語ですがアップされている動画は各話に対して5〜10本位の小間切れになっていてますます悲しみに拍車が掛かります。
なんとか後者の悲しみを払拭すべく一話形式にまとめてみたいと思います。

concat

ダウンロードしてひとつのディレクトリにまとめておきます。
テキストファイル filesを作成

file '四月は君の嘘 04 #1-ExLklteXMDA.mp4'
file '四月は君の嘘 04 #2-SuZTfIa1O88.mp4'
file '四月は君の嘘 04 #3-GM2vB0_ecLA.mp4'
file '四月は君の嘘 04 #4-OCsH3K1kXkE.mp4'
file '四月は君の嘘 04 #5-3OWiaRIb7z8.mp4'
file '四月は君の嘘 04 #6-THvTrD5f49w.mp4'
$ ffmpeg -safe 0 -f concat -i files -c:v copy -c:a copy uso-04.mp4


speed 140x 〜 151x
concatは基本コピーなので処理が早い


ほとんど違和感もなくうまくつながりました。

画像サイズは5話まで640×360以降は1280×720になっているようです。
640×360の映像は上記の方法でうまく行くのですが1280×720の映像はノイズや色ズレなどが発生してうまく繋がりません。
そこで一旦tsファイルに変換してからmp4ファイルを作成してみました。
参考サイト ffmpegコマンドで複数のmp4動画を無劣化で結合する方法
テキストファイル concat-ts 作成

ffmpeg -i "四月は君の嘘 10 #1-EzS6353s5Tw.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts 01.ts
ffmpeg -i "四月は君の嘘 10 #2-Ul5E2TJSMFc.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts 02.ts
ffmpeg -i "四月は君の嘘 10 #3-BuplOmZzdOo.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts 03.ts
ffmpeg -i "四月は君の嘘 10 #5-IxFlN4u8SlE.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts 05.ts
ffmpeg -i "四月は君の嘘 10 #6-2CDCQ3t7S84.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts 06.ts
ffmpeg -i "四月は君の嘘 10 #7-Vyf9MEkMfkE.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts 07.ts
ffmpeg -i "四月は君の嘘 10 #8-jpVZnvexDW8.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts 08.ts

ffmpeg -i "concat:01.ts|02.ts|03.ts|05.ts|06.ts|07.ts|08.ts" -c copy uso-10.mp4

rm *ts

concat-ts 実行

$ sh concat-ts


今度はうまく繋がってくれました。

scale

当サイトのディスプレーは1024×768です(今時こんなディスプレー使っている人は少ないですね(・・;)
mpvは画面サイズに合わせて縮小して表示しますがffplayは実サイズで起動します。
640×360は1024×576にサイズアップ
1280×720は1024×576にサイズダウンしてみます。
テキストファイル scale 作成

$ ffmpeg -i uso-04.mp4 -vf "scale=1024:-1" -q 2 "四月は君の嘘04.mp4"
$ ffmpeg -i uso-10.mp4 -vf "scale=1024:-1" -q 2 "四月は君の嘘10.mp4"

scale 実行

$ sh scale

通常のPCではどれくらいの速度が出るのかわかりませんがPi3ではspeed 0.4〜0.5くらいと処理に時間がかかります。単純に再生時間の2倍以上とみていいでしょう。
640×360から1024×576にサイズアップした映像も視聴には問題ないレベルと思います。(元ファイル次第)