2016年4月30日土曜日

動画、音声変換、コーデック、コンテナ変更 自由自在::切り貼りして即使えるffmpeg 加工例文集

ffmpeg :世界標準って感じがします

切り貼りして即使えるがコンセプト。

気が向いた時点で例文を書き足していこうかと思います。いくつかのパターンさえメモしておけばたいてい対応できるのではないでしょうか。Linuxでの結果ですが、インストールさえすればWindows10でも同様に扱えますので、Windowsユーザーの方もどうぞ。これを機会にWSL(Windows Subsystem for Linux)を使い始めてもいいでしょう。試してみるとあっけなさ、カンタンさに特にWindowsユーザーであれば驚くと思います。

最小限知識:ffmpegの基本:ファイルを読んで、別のファイルに変換する

フォーマット=コンテナの変換は拡張子を変えるだけです。 flv をmp4 など。
ffmpegは拡張子を判別します。タイプがあるとしらんがなとエラーを吐きます。あらゆる形式に対応しているわけではありません。ほぼ必要と考えられる形式には対応しています。コンパイルオプションによる。

ffmpeg  -i infile.flv out.m4v
ffmpeg  -i infile.mov out.mp4

まとめ

ffmpeg  -i infile.ぐしゃ out.ほにゃ
 ... みたいな感じが基本。覚えるのはこれだけです。(本当)


変換が完了しても、カメラなどからひっぱったオリジナルファイルは残しておいたほうがいいです。 のちのち再生不良気味になった場合にオリジナルから、その時のffmpegなどで使いやすいフォーマットに変換すればいいからです。x264は枯れているといいきってもいいと思いますが、hevc対応ソースは発展途上といえるので特に注意が必要かなと思います。

ビデオとサウンドを無劣化コピーするか、変換/エンコードしてもいいのか。脳裏においておいたほうがいいかも。 

WindowsビデオのWMVをm2ts形式に

WindowsビデオのWMVをm2ts形式にしてみる。x264で音声はそのまま。ムービーメイカー(Win7の無料のアレ)などでうまくいかなければ、別コンテナで試してみるといいかも。

ビデオコーデックと音声のそれを別々にも指定できますし、劣化なしを望むならコピーでもいいわけで。ffmpegとコンテナが対応していれば次のように。

絵 は、x264/AVCでエンコード、サウンドはコピー。基本はこんなかんじ。


ffmpeg -i in.wmv -vcodec libx264 -acodec copy out.m2ts

HEVCで小さめのファイルにしたい場合

高圧縮(=サイズ小)でも粗が目立たない動画にする例。HEVCは画質が良いわけではないです。良くなるわけでもないです。サイズの割に高画質と私 は理解しています。

CPUが遅いとエンコードに笑えるほど時間がかかりますので、電気の無駄かもしれません。HEVCが正式名称ですが、あえてオプションは過去の経緯を 踏まえたものになっているのでしょうか。

ffmpeg -i in.mp4 -vcodec libx265 -acodec copy out.m4v

サイズ半分というか、40%圧縮ってかんじかもしれません。SDカードのないスマホを使っている場合にどうしても保存しておきたい動画があるんだ!! みたいな場合かな。今の時代、そこまでストレージに困窮することはないはずなので。Nexus6やiPhoneですね。

GPUハードウェア支援・アクセラレーションを有効にしてみる


エンコーディングをx264でやり直して、audioはそのままで、m4vコンテナにする。ついでにvdpau(unix/linuxのHWアクセル)を効かせる。WindowsならDXVA2か?! HW支援は推奨されていません(というメッセージがでます。そのうち正式対応されるかも)

ffmpeg -hwaccel vdpau -i in.file -vcodec libx264 -acodec copy outfile.m4v

範囲切り出し

45秒から10秒切り出し。
最初に切り出し開始のスタート地点を指定する、このオプションの順番がいいかも。範囲切り出し。例文はエンコ、デコードもしないで済むファイル内容・設定なので超速いです(単なるコピー)。必要ならlixb264などでどうぞ。GUIアプリより便利かも。

ffmpeg -ss 00:00:45 -i infile -t 10 -vcodec copy -acodec copy ./cut/cut.m4v

■BDAVフォーマットの「マイBlu-rayディスク」作成の準備作業

Windows7のムービーメーカーで作成したWMV形式のファイル。これを一括してビデオはH.264、音声はAC3に変換しながら、コンテナをm2ts形式にする。

たぶんですがBDAV作成でもっともトラブルがないコーデックがこの組み合わせなのではないかと思います。一時期凝ってみたがいまは飽きた。数が多い場合は、find を使うと効率的です。Windowsでは forfiles などでお願いします。

find . -name  "*.wmv" -exec ffmpeg -i {} -vcodec libx264 -acodec ac3 -ab 320k {}-x264-AC3.m2ts \; 

途中表示ではこんな風になります。

Stream mapping:
  Stream #0:2 -> #0:0 (wmv3 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (wmav2 (native) -> ac3 (native))

※テストに使ったファイルはWindows7ムービーメーカー出力です。音声、映像共にエンコードしますので、時間がかかります。市販BDのようなかっこいい メニューのあるBDディスクを作るわけではありません。BDMVの場合は素直にWindows市販ソフトウェアを購入したほうが楽でいいかと思います。

いずれにせよ。
はなからソースファイルがm2tsという人は高機能ビデオカメラ所有者は別としてそんなに多くない気がしますので、結局のところ、トランスコード(エンコード)するわけで、すっげー 時間がかかるわけですね。

※ 準備作業です。この生成されたファイルをそのままBDに焼いただけでBDAVディスクになるわけはありません。 BDAVの仕様に合わせたファイルを更に生成し、ディレクトリ構造を適正にして焼き込みます。めんどくさいです。ディレクトリ構造まで作成できるスクリプ トは組んでみましたが、とにかくフォーマットを合わせるのにCPU資源が必要なのでいまいちテンションがあがりません。

■m2tsにしておいた2kファイルを4kにアップスケールする(カレント一括。mkvコンテナへ)


for f in *.m2ts; do ffmpeg -i "$f" -vf scale=3840:-1 "${f%*.m2ts}.mkv"  ; done

単独

ffmpeg -i 2k.m2ts -vf scale=3840:-1 4k.mkv


※handbrake-cli 派はそちらで。


■音声をAACにする場合

少しだけオプションを書き足します。 WMV(などマイクロソフトのフォーマット)は個人的には世界から撲滅の方向で。AACが悪いわけではないですよ。標準的なフォーマットがやはりよいです。
ffmpeg -i in.wmv -vcodec libx264 -acodec aac -strict -2 out.m4v


■音声のみ、または、映像のみ抜き出す場合

動画から音声だけを好きな形式で抜き出す。単車のエンジン音をこれで記録しています。

ffmpeg -i 動画 -map 0:1 out.ogg
ffmpeg -i 動画 -map 0:1 out.flac
ffmpeg -i 動画 -map 0:1 out.ac3
ffmpeg -i 動画 -map 0:1 out.mp3

いろいろ試してみてください。コンテナにどんな音声フォーマットで格納されているのかは、

mediainfoなどでも、
ffmpeg -i ファイル

とか……確認できます。 同等それ以下の音質にはなりますが、元以上の音にはなりません。当方のようにガソリンエンジン音を抜き出すみたいな用途は特殊かもしれない。

動画から映像だけを抜き出す。無劣化。無声映画・サイレントみたいな。

ffmpeg -i 動画 -map 0:0 -vcodec copy videoonly.mp4

レースの撮影動画では、実況アナウンスやBGM(だいたいQUEENです。お約束)と排気音が入りますが、鈴鹿サーキットに限らずうるさい。^^; 無音声にして、BGMを別に載せてTVで観るのがいいかなと。

#カンタンな動画の結合、ループファイルをつくってみたり

ffmpeg -f concat -safe 0 -i list.txt -c copy loop.mkv

用意するファイル::ファイル名はもちろん自由です。
cat list.txt
#以下2つを結合する。同名ファイルでうまくなかったので、シンボリックリンクで別の名前をつけた。以下のa b は同じファイル。
file 'a.mkv'
file 'b.mkv'

リストを作るだけなので、とても楽。 数秒など短時間動画をすぱっとひとつのファイルに粗編集して様子をみるっていう場合なんかに便利かもしれません。

#無声動画に音声を加える。エンコーディングなし。


ffmpeg -i 映像_videoonly.mkv -i audio.flac -c copy merged.mkv
https://superuser.com/questions/277642/how-to-merge-audio-and-video-file-in-ffmpeg

#当たり前すぎるけど、音声ファイルの変換にも使えます。

ffmpeg -i audio.wav audio.mp3 
以下のような一括コマンドで処理すれば、カップヌードル食べている間に100曲は処理できると思います。

find /for で一括変換(flac から ogg|mp3|m4a)する。

二重拡張子を後続コマンドでリネーム。手抜き書式。
find *flac -exec ffmpeg -i {} {}.ogg \; && rename 's|.flac.ogg|.ogg|' *flac.ogg

かっこわるい点:&&の前で処理したいのだけど、よい方法がわからない。{}を変数として扱う方法がわからない。目的に対しては単純な方法なのでこれでいいんだけど。 while read で処理はできるが打鍵数が多いので使い捨てとしてはいまいち。 -exec の連続もかっこ悪い。

ま、ぜんぶまとめての場合は、別に考えたほうがいいですね。
かっこわるいんじゃなくて、これでいいのか。 見通しもいいし。KISS!
 
シェルでカレント一括で処理したい場合はこんなかんじのワンライナーで。アルバム単位ディレクトリに音楽ファイルが複数あった場合に、一括で変換するってことです。

第2案;; これのほうがいいですね。
FLACから各種フォーマットに変換
oggに
for flac in *.flac ; do ffmpeg -i "$flac" "${flac//flac/}ogg" ; done
mp3に
for flac in *.flac ; do ffmpeg -i "$flac" "${flac//flac/}mp3" ; done
m4aに
for flac in *.flac ; do ffmpeg -i "$flac" "${flac//flac/}m4a" ; done

※たとえばこれらのコマンド行を1行づつファイルにして、スクリプトフォルダにおいておけば右クリックで一括変換です。 以下を右クリックメニューの拡張 scripts nemo caja参照してみてください。