ffmpeg :: いまや世界標準。バックエンドで動作させるだけでなく、たまには主役として扱ってみる
切り貼りして即使える,がコンセプト
気が向いた時点で例文を書き足していこうかと思います。いくつかのパターンさえメモしておけばたいてい対応できるのではないでしょうか。
Linuxでの結果ですが、インストールさえすればWindows10でも同様に扱えますので、Windowsユーザーの方もどうぞ。これを機会にWSL(Windows Subsystem for Linux)を使い始めてもいいでしょう。試してみるとあっけなさ、カンタンさに特にWindowsユーザーであれば驚くと思います。
もっともWindows用バイナリも配布されていますね。Windowsユーザーでもコマンドはまったく同じです。
最小限知識 :: ffmpegの基本はファイルを読んで別の形式のファイルに変換すること
これだけ覚えておけば大丈夫です。
フォーマット=コンテナの変換は拡張子を変えるだけです。 flv をmp4 など。
ffmpegは拡張子判別が基本です。
タイプがあるとしらんがなとエラーを吐きます。あらゆる形式に対応しているわけではありません。ほぼ必要と考えられる形式には対応しています。コンパイルオプションにもよります。
ffmpeg -i infile.flv out.m4v
ffmpeg -i infile.mov out.mp4
まとめると
ffmpeg -i infile.ぐしゃ out.ほにゃ
変換が完了しても、カメラなどからひっぱったオリジナルファイルは残しておいたほうがいいです。
のちのち再生不良気味になった場合にオリジナルから、その時のffmpegなどで使いやすいフォーマットに変換すればいいからです。
x264は枯れているといいきってもいいと思いますが、hevc対応ソースは発展途上といえるので特に注意が必要かなと考えています。
WAVからMP3を生成::当たり前すぎるけど、音声ファイルの変換にも使える
wav から mp3を生成する例
ffmpeg -i audio.wav audio.mp3
記事末尾のような一括コマンドで処理すれば、カップヌードルを食べている間に100曲は処理できると思います。ffmpeg -i audio.wav audio.mp3
ビデオとサウンドを無劣化コピーするか、変換/エンコードしてもいいのか。脳裏においておきましょう。時間の節約にもつながります。
たとえば、WindowsビデオのWMVをm2ts形式にする例文
例として、WindowsビデオのWMVをm2ts形式にしてみる。x264エンコードしなおして、音声はそのままコピーする。
ムービーメイカー(Win7の無料のアレ)などでうまくいかなければ、別コンテナで試してみるといいかも。
ビデオコーデックと音声のそれを別々にも指定できますし、劣化なしを望むからコピーでもいいわけで。ffmpegとコンテナが対応していれば次のようにします。無劣化でコピーすると品質の担保と時間節約、両方に効果があります。
絵 は、x264/AVCでエンコード、サウンドはコピー。基本はこんなかんじ。
ffmpeg -i in.wmv -vcodec libx264 -acodec copy out.m2ts
ffmpeg -i in.wmv -vcodec libx264 -acodec copy out.m2ts
音質とサイズバランスを考慮 libfdk-aac で最強手前のAAC/m4aを作る
穏やかな着地点というかんじ。libfdk-aacについてはググっていただくとして、音質に定評のある変換です。
ffmpeg -i "heavy.flac" -ar 48k -vn -ac 2 -ab 256k -acodec libfdk_aac -profile:a aac_he "output.m4a"
CD-DAのケースなら
-ar 44100
に差し替える。44.1k でも通るかも。
これで78点。再評価すると96点になるかも。nero AAC よりも良いのではないでしょうか。
アフターバーナー(afterburner)はこれで効いています。よって付けません。長くなるので。
このffmpeg はコンパイルが必要です。少しめんどうです。ffmpeg -i "heavy.flac" -ar 48k -vn -ac 2 -ab 256k -acodec libfdk_aac -profile:a aac_he "output.m4a"
CD-DAのケースなら
-ar 44100
に差し替える。44.1k でも通るかも。
これで78点。再評価すると96点になるかも。nero AAC よりも良いのではないでしょうか。
アフターバーナー(afterburner)はこれで効いています。よって付けません。長くなるので。
ディストロ標準では動作しませんのでご注意を。
この項目は、2020年8月20日にコンパイルしなおした ffmpeg にて動作確認して、加筆しています。
スマホでなんでも持ち歩きたい人 :: HEVCで小さめのファイルにしたい場合
高圧縮(=サイズ小)でも粗が目立たない動画にする例。HEVCは画質が良いわけではないです。良くなるわけでもないです。サイズの割に高画質と私 は理解しています。
CPUが遅いとエンコードに笑えるほど時間がかかりますので、電気の無駄かもしれません。HEVCが正式名称ですが、あえてオプションは過去の経緯を 踏まえたものになっているのでしょうか。
ffmpeg -i in.mp4 -vcodec libx265 -acodec copy out.m4v
サイズ半分というか、40%ほど小さく圧縮ってかんじかもしれません。microSDカードのないスマホを使っている場合にどうしても保存しておきたい動画があるんだ!! みたいな場合かも。今の時代、そこまでストレージに困窮することはないはずなので。Nexus6やiPhoneですね。クラウドが常識になってきたのでそれもあまり意味はないかもしれません。
と、4年前に書いたわけですが、もうhevc は標準ですね。各種ツールも信頼してもよい。CPUが遅いとエンコードに笑えるほど時間がかかりますので、電気の無駄かもしれません。HEVCが正式名称ですが、あえてオプションは過去の経緯を 踏まえたものになっているのでしょうか。
ffmpeg -i in.mp4 -vcodec libx265 -acodec copy out.m4v
サイズ半分というか、40%ほど小さく圧縮ってかんじかもしれません。microSDカードのないスマホを使っている場合にどうしても保存しておきたい動画があるんだ!! みたいな場合かも。今の時代、そこまでストレージに困窮することはないはずなので。Nexus6やiPhoneですね。クラウドが常識になってきたのでそれもあまり意味はないかもしれません。
GPUハードウェア支援・アクセラレーションを有効に
エンコーディングをx264でやり直して、audioはそのままで、m4vコンテナにする。ついでにvdpau(unix/linuxのHWアクセル)を効かせる。WindowsならDXVA2か?!重箱の隅をつつく話ですが、HW支援を使わずにCPUにがんばってもらうほうが画質面では有利じゃないでしょうか。
ffmpeg -hwaccel vdpau -i in.file -vcodec libx264 -acodec copy outfile.m4v
ffmpeg -hwaccel vaapi -i in.file -vcodec libx264 -acodec copy outfile.m4v
ffmpeg -hwaccel vaapi -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))
途中表示ではこんな風になります。
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資源が必要なのでいまいちテンションがあがりません。
4Kアップスケール :: たとえば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
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 派はそちらでお願いします。当方では最近handbrakeもほとんど使いませんね。もともとffmpegの実験ニーズしかなかったので。
音声をAACにする場合のオプション指定(普通の方法)
libfdk-aacを使う生成が音質が担保できますので、既述の例をご覧ください。少しだけオプションを書き足します。 WMV(などマイクロソフトのフォーマット)は個人的には世界から撲滅の方向で。AACが悪いわけではないですよ。標準的なフォーマットがやはりよいです。AACも標準ですが。だはは。
ffmpeg -i in.wmv -vcodec libx264 -acodec aac -strict -2 out.m4v
音声のみ、または、映像のみ抜き出す場合::たとえばyoutube
動画から音声だけを好きな形式で抜き出す。単車のエンジン音をこれで記録しています。たとえば、youtube-dl でローカルキャッシュ代わりにしてみた、動画ファイルから、音声のみ抜き出す場合には思い出してください。最近では、VP9/opus がyoutube標準ですから opus で音声抜き出しすると無劣化です。最初から opusでダウンロードすることもできますが、本稿の範囲から外れるので書きません。
ffmpeg -i 動画 -map 0:1 out.opus
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: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'
リストを作るだけなので、とても楽。 数秒など短時間動画をすぱっとひとつのファイルに粗編集して様子をみるっていう場合なんかに便利かもしれません。
用意するファイル::ファイル名はもちろん自由です。
cat list.txt
#以下2つを結合する。同名ファイルでうまくなかったので、シンボリックリンクで別の名前をつけた。以下のa b は同じファイル。
file 'a.mkv'
file 'b.mkv'
リストを作るだけなので、とても楽。 数秒など短時間動画をすぱっとひとつのファイルに粗編集して様子をみるっていう場合なんかに便利かもしれません。
無声動画に音声(BGM)を加える。エンコーディングなしなので速い
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 めんどくさいことはシェルにやらせよう。ざっくり一括変換(flac から ogg|mp3|m4a|opus)
たとえばこれらのコマンド行を1行づつファイルにして、スクリプトフォルダにおいておけば右クリックで一括変換です。右クリックメニューの拡張 scripts nemo caja を参照してみてください。natilus でも同じことです。おすすめです。
シェルでカレント一括で処理したい場合はこんなかんじのワンライナーで。
アルバム単位ディレクトリに音楽ファイルが複数あった場合に、一括で変換するってことです。
アルバム単位ディレクトリに音楽ファイルが複数あった場合に、一括で変換するってことです。
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
opusに
for flac in *.flac ; do ffmpeg -i "$flac" "${flac//flac/}opus" ; done