FFmpegのエンコード設定と基本的な使い方
FFmpegの基本的な使い方と普段個人的に使用しているエンコード設定のコマンド例を自分用にまとめました。最後にFFmpegのダウンロードの仕方からインストール、パスを通すまでの簡単な説明と画像を載せてあります。あくまでも自分が忘れないための備忘録です。
FFmpegの起動の仕方
まずは、FFmpegを起動するために、コマンドプロンプトでffmpeg.exeが置いてある場所までディレクトリ移動(ディレクトリを指定する)します。
c直下のフォルダffmpeg内のbinフォルダにffmpeg.exe、ffplay.exe、ffporbe.exeが入っている場合、
cd c:\ffmpeg\bin
と入力し最後にエンターキーを押します。
cd > 半角スペース > c > コロン > バックスラッシュ > ffmpeg > バックスラッシュ > bin > エンターキー(押す)
日本語環境ではバックスラッシュはコマンドプロンプトでは円マークで表示されます。
上記の画像のように次の行がc:\ffmpeg\bin>となればディレクトリ移動は完了です。
ffmpeg.exeが置いてある場所までディレクトリ移動する(ディレクトリを指定する)コマンド
cd c:\ffmpeg\bin
動画をffplayにパイプを通して音声付きでプレビュー
次に、エンコードしたい動画をffplayにパイプを通してエンコードする前の動画を音声付きでプレビューしてみます。
フィルタなし設定
ffmpegでプレビュー
ffmpeg -i "input.mp4" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 -f matroska - | ffplay -i -
プレビューする動画ファイル名はここではinput.mp4とします。
上記のコマンドをコマンドプロンプトにコピペ又は打ち込みエンターキーを押します。
すると上記の画像のようにffplayが起動してエンコード前の出力動画のプレビューが出来ます。ffplayの位置やサイズはマウスで調整できます。ここではmp4ファイルを使用しましたがavi,flv,mov,mp4,mkv,ts,wmv,etcほぼ全てのコーデック形式に対応しています。
ffplayにパイプを通して音声つきでプレビューするには-f matroska - | ffplay -i -
コマンドが大変便利です。
ffplayにパイプを通して音声つきでプレビューするコマンド
-f matroska - | ffplay -i -
ネットでの再生環境へ最適化してmac等の他のデバイスでも再生出来るようにエンコード
それでは実際に動画をエンコードするコマンドを以下に示します。このソースコードはyoutube等の動画を作成する時にも使える便利なサンプルコードです。又、macやwindows media player等でも不具合なく再生できます。
ffmpeg -i "input.mp4" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
-i "input.mp4"
でエンコードするファイルを入力しています。ここではmp4ファイルを使用しましたがavi,flv,mov,mp4,mkv,ts,wmv,etcほぼ全てのコーデック形式に対応しています。
-movflags +faststart
でmoov atomの位置(メタ情報の位置)を先頭に持って来てネットでの再生環境へ最適化しています。HandBrakeのWeb Optimized、Xmedia Recodeのストリーミング Fast-Startと同じオプションになります。-pix_fmt yuv420p
でmac等の他のデバイスでも再生出来るようにフォーマットを最適化しています。
-c:v libx264
でビデオコーデックにh264を指定しています。
-crf 20
で品質を指定しています。設定出来る範囲は0から51でデフォルト値は23。何も設定しなければデフォルト値23が適用されます。
"output.mp4"
で出力コンテナとファイル名を指定しています。
ffmpegのエンコードで最も基本的なコマンド
Converting video and audio has never been so easy.
https://www.ffmpeg.org/
ちなみにffmpegのエンコードで最も基本的なコマンドは以下になります。
ffmpeg -i input.avi output.mp4
ffmpeg -i "入力ファイル名.入力拡張子" "出力ファイル名.出力拡張子"
-i
で入力ファイルを、次に出力ファイルを設定するだけで適切なデコーダとエンコーダが適用されて簡単に使用できます。出力ファイルの拡張子をmp4で指定した場合、デフォルトの映像コーデックはH.264
、音声コーデックはaac
になります。品質固定モードのデフォルト値23でエンコードされます。
FFmpegで動画を無劣化で結合(連結)する
まずはテキストファイルを作成します。
file 'c:/ffmpeg/bin/input1.mp4' file 'c:/ffmpeg/bin/input2.mp4' file 'c:/ffmpeg/bin/input3.mp4' file 'c:/ffmpeg/bin/input4.mp4'
上記のように絶対パスでファイルの置いてある場所(ffmpeg.exeと同じ場所に置いてあるものとする)とファイル名をテキストエディータに記述してmylist.txt
のようにテキストファイルをBOM無しのUTF-8で保存します。相対パスで記述することも出来ますが、Windowsの場合は絶対パスが個人的にはベスト。先頭にfile、半角スペース、ファイルのある場所とファイル名を上記のように記述(円マークではなくスラッシュで区切ります)してクォーテーションで囲みます。結合(連結)する動画は同じ解像度、同じコーデック形式である必要があります。記述した順番にファイルを結合(連結)します。
ffmpeg -f concat -safe 0 -i "mylist.txt" -c copy -movflags +faststart "output.mp4"
上記のコマンドをコマンドプロンプトにコピペ又は打ち込みエンターキーを押します。
ほぼ一瞬で無劣化結合(連結)されたファイルが完成します。
-f concat
で複数入力した動画の結合(連結)の指定をしています。
-safe 0
-safe 0
オプションは絶対パスで指定した場合のエラー回避の指定方法。相対パスで指定した場合は、記述しなくも良いのであります。
-i "mylist.txt"
で作成したテキストファイルを入力しています。
-c copy
で連結するファイルのコーデックをコピーで指定しています。エンコードは行わず無劣化で映像と音声が出力されます。
-movflags +faststart
でmoov atomの位置(メタ情報の位置)を先頭に持って来てネットでの再生環境へ最適化しています。HandBrakeのWeb Optimized、Xmedia Recodeのストリーミング Fast-Startと同じオプションになります。
"output.mp4"
で結合(連結)した出力コンテナと出力ファイル名を指定しています。
尚、相対パスでのテキストファイルの記述方法とコマンドは以下になります。
file 'input1.mp4' file 'input2.mp4' file 'input3.mp4' file 'input4.mp4'
先頭にfile、半角ペース、ファイル名をクォーテーションで囲みます。クォーテーションは無くても構いません。
ffmpeg -f concat -i "mylist.txt" -c copy -movflags +faststart "output.mp4"
エンコードして結合(連結)する場合は以下のようになります。
mylist.txtの記述方法が絶対パスの場合
ffmpeg -f concat -safe 0 -i "mylist.txt" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
mylist.txtの記述方法が相対パスの場合
ffmpeg -f concat -i "mylist.txt" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
Line 1: unknown keywordというエラーが出る場合
Line 1: unknown keyword '∩?┐file'
mylist.txt: Invalid data found when processing input
このようなエラーが出る場合、原因はmylist.txt
の文字コードがBOM付きのUTF-8
等で保存されている可能性があります。その場合はmylist.txt
をBOM無しのUTF-8
で保存します。使用しているテキストエディータがテラパッドの場合はUTF-8N
で保存するとBOM無しのUTF-8
で保存できます。テラパッドは文字コードをUTF-8
で保存するとBOM付きのUTF-8
になります。
FFmpegで無劣化で映像や音声を取り出したり合成したりするコマンド例
無劣化で映像や音声を取り出したり合成したりするコマンド例です。
無劣化で音声だけ取り出す。
ffmpeg -i "input.mp4" -vn -c:a copy "output.m4a"
-vn
で映像を無効にして-c:a copy
で音声をコピーしています。
ffmpeg -i "input.mp4" -map 0:1 -c:a copy "output.m4a"
-map 0:1
で音声のみ抽出して-c:a copy
で音声をコピーしています。
無劣化で映像だけ取り出す。
fffmpeg -i "input.mp4" -c:v copy -an "output.mp4"
-c:v copy
で映像をコピーして-an
で音声を無効にしています。
ffmpeg -i "input.mp4" -map 0:0 -c:v copy "output.mp4"
-map 0:0
で映像のみ抽出して-c:v copy
で映像をコピーしています。
映像と音声を無劣化でそれぞれ取り出す。
fffmpeg -i "input.mp4" -c:v copy -an "video.mp4" -vn -c:a copy "audio.m4a"
-c:v copy
で映像をコピーして-an
で音声を無効にして"video.mp4"
で映像のみ出力しています。-vn
で映像を無効にして-c:a copy
で音声をコピーして"audio.m4a"
で音声のみ出力しています。
fffmpeg -i "input.mp4" -map 0:0 -c:v copy "video.mp4" -map 0:1 -c:a copy "audio.m4a"
-map 0:0
で映像のみ抽出して-c:v copy
で映像をコピーして"video.mp4"
で映像のみ出力しています。-map 0:1
で音声のみ抽出して-c:a copy
で音声をコピーして"audio.m4a"
で音声のみ出力しています。
無劣化で特定の部分だけ切り出す
ffmpeg -ss 6 -i "input.mp4" -t 30 -c copy "output.mp4"
-ss 6
と-t 30
で開始6秒から30秒間切り出す指定をしています。-ss 6
の部分は-ss 00:06
とmm:ss
方式でも記述できます。切り出す部分が60分目以降の場合はhh:mm:ss
方式で-ss 01:02:05
(1時間2分5秒)のように記述出来ます。無劣化で切り出す場合はキーフレーム部分からしか切り出せないので、指定した時間から最も近いキーフレーム部分から切り出します。無劣化で特定の部分だけ切り出す場合は、指定した時間から切り出す位置がキーフレーム分、ずれます。指定した時間や切り出したい位置から正確に切り出すには、エンコードをする必要があります。
エンコードをして特定の部分だけ切り出すコマンド
ffmpeg -ss 06 -i "input.mp4" -t 30 -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
映像と音声を無劣化で合成
ffmpeg -i "video.mp4" -i "audio.m4a" -c copy -map 0:v:0 -map 1:a:0 "output.mp4"
-c copy
で映像と音声のコピーを指定して-map 0:v:0
で一番目に入力した映像を抽出、-map 1:a:0
で二番目に入力した音声を抽出して"output.mp4"
で合成出力しています。
映像と音声を無劣化で合成 音声を5秒遅らせる
ffmpeg -i "video.mp4" -itsoffset 5 -i "audio.m4a" -c copy -map 0:v:0 -map 1:a:0 -shortest "output.mp4"
-itsoffset 5
で2番目に入力したaudio.m4a
の音声を5秒遅らせています。-shortest
で短い方の入力ファイルが終了したら、出力を終了する指定をしています。
無劣化でネットでの再生環境へ最適化する
ffmpeg -i "input.mp4" -movflags +faststart -c copy "output.mp4"
-movflags +faststart
でmoov atomの位置(メタ情報の位置)を先頭に持って来てネットでの再生環境へ最適化しています。HandBrakeのWeb Optimized、Xmedia Recodeのストリーミング Fast-Startと同じオプションになります。
動画からサムネイル画像を1枚だけ作成する
ffmpeg -ss 10 -i "input.mp4" -vf "thumbnail,scale=240:-1" -frames:v 1 -qmin "1" -q "1" "output.jpg"
-ss 10
とthumbnail
で開始10秒から100フレームの間でサムネイルにするフレームを自動選択する指定をしています。scale=240:-1
で横幅240px,縦幅をアスペクト比を保ったまま自動計算でリサイズする指定をしています。-frames:v 1
で1フレーム分だけ出力する指定をしています。-qmin "1" -q "1"
で出力画質を最高画質で指定しています。
入力したファイルの情報を調べる
ffprobe -i "入力ファイル名.入力拡張子"
フィルタオプションの表示
ffprobe -i "input.mp4"
ffmpeg -filters
FFmpegでGPUエンコード(ハードウェアエンコード)するコマンド例
FFmpegでGPUエンコード(ハードウェアエンコード)する場合のコマンド例です。
グラフィックボードがRadeonの場合のh264GPUエンコード例
ffmpeg -i "input.ts" -c:v h264_amf "output.mp4"
-i "input.ts"
で入力ファイルの指定をして、-c:v h264_amf
で映像をh264GPUエンコードの指定をして、"output.mp4"
で出力しています。
グラフィックボードがRadeonの場合のh265GPUエンコード例
ffmpeg -i "input.ts" -c:v hevc_amf "output.mkv"
-i "input.ts"
で入力ファイルの指定をして、-c:v hevc_amf
で映像をh265GPUエンコードの指定をして、"output.mkv"
で出力しています。
グラフィックボードがGeForceの場合のh264GPUエンコード例
ffmpeg -i "input.ts" -c:v h264_nvenc "output.mp4"
-i "input.ts"
で入力ファイルの指定をして、-c:v h264_nvenc
で映像をh264GPUエンコードの指定をして、"output.mp4"
で出力しています。
グラフィックボードがGeForceの場合のh265GPUエンコード例
ffmpeg -i "input.ts" -c:v hevc_nvenc "output.mkv"
-i "input.ts"
で入力ファイルの指定をして、-c:v hevc_nvenc
で映像をh265GPUエンコードの指定をして、"output.mkv"
で出力しています。
IntelのQSV(Intel Quick Sync Video)を利用したh264GPUエンコード例
Sandy Bridge以降のCPUから対応しています。
CPUがSandy Bridge or Ivy Bridgeの場合
ffmpeg -i "input.ts" -c:v h264_qsv -look_ahead 0 "output.mp4"
CPUがHaswell以降の場合
ffmpeg -i "input.ts" -c:v h264_qsv "output.mp4"
-i "input.ts"
で入力ファイルの指定をして、-c:v h264_qsv
で映像をh264GPUエンコードの指定をしています。-look_ahead 0
で-look_ahead
に対応してないSandy Bridge or Ivy BridgeのCPUの場合、エラーを吐き出すので、明示的に入力することによってエラーを回避しています。"output.mp4"
で出力しています。
IntelのQSV(Intel Quick Sync Video)を利用したh265GPUエンコード例
Sky Lake以降のCPUから対応しています。
ffmpeg -i "input.ts" -c:v hevc_qsv "output.mkv"
-i "input.ts"
で入力ファイルの指定をして、-c:v hevc_qsv
で映像をh265GPUエンコードの指定をして、"output.mkv"
で出力しています。
FFmpegでjpg画像をグレースケールにする
jpg画像を高画質でグレースケールに変換したい場合はffmpegを使用すると綺麗に変換できるので個人的にオススメです。
ffmpegでコンバート
ffmpeg -i "input.jpg" -vf "format=gray" -qmin "1" -q "1" "output.jpg"
上記のコマンドをコマンドプロンプトにコピペ又は打ち込みエンターキーを押します。
ほぼ一瞬でグレースケールにコンバートされたファイルが完成します。
-i "input.jpg"
で変換する画像を入力しています。
"format=gray"
でグレースケールにフォーマット変換する指定をしています。
-qmin "1" -q "1"
で出力画質を最高画質で指定しています。
"output.jpg"
で出力ファイル名を指定しています。
FFmpegでjpg画像をリサイズしてグレースケールにする
ffmpegでコンバート
ffmpeg-i input.jpg -vf "format=gray,scale=480:trunc(ow/a/2)*2" -qmin "1" -q "1" "output.jpg"
format=gray,scale=480:trunc(ow/a/2)*2
でグレースケールにフォーマット変換する指定をして横幅を480px、縦幅をアスペクト比を保ったまま端数を切り捨てて2の倍数になるようにリサイズの指定をしています。画像の場合は横幅や縦幅が奇数の場合が多々あるのでエラー回避のために切り捨て丸め処理を行うtrunc
エクスプレッションを使用しています。ffmpegは出力ファイルの縦幅、横幅のどちらかが奇数になる場合(2の倍数ではない場合)、エラーを吐き出します。
フィルタをかけたエンコード設定のコマンド例
普段、個人的に使用しているフィルタをかけたエンコード設定のコマンド例です。
ノイズ除去+unsharp設定
ffmpeg -i "input.ts" -filter_complex "vaguedenoiser,unsharp=3:3:0.3:3:3:0.3" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
ノイズ除去+unsharp+リサイズ設定
ffmpeg -i "input.ts" -filter_complex "scale=hd1080:flags=lanczos+accurate_rnd,vaguedenoiser,unsharp=3:3:0.3:3:3:0.3" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
ノイズ除去+unsharp+クロップ+リサイズ設定
ffmpeg -i "input.ts" -filter_complex "crop=iw-0:ih-2*38,scale=1280:720:flags=lanczos+accurate_rnd,vaguedenoiser,unsharp=3:3:0.3:3:3:0.3" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
2Dダウンスケーリング設定
ffmpeg -i "input.ts" -filter_complex "scale=640-1:flags=lanczos+accurate_rnd,vaguedenoiser,unsharp" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
2Dアップスケーリング設定
ffmpeg -i "input.ts" -filter_complex "scale=hd1080:flags=lanczos+accurate_rnd,vaguedenoiser,unsharp=7:7:0.7" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
unsharp=3:3:0.3:3:3:0.3
で輪郭をシャープにするを指定をしています。画質が良い場合は若干弱めで。デフォルト値はunsharp=5:5:1.0:5:5:0.0:5:5:0.0
でunsharp
と記述すればデフォルト値が適用されます
vaguedenoiser
でノイズ除去をデフォルト値で指定しています
scale=hd1080:flags=lanczos+accurate_rnd
でスケーリングアルゴリズムを指定してFullHDサイズでリサイズを指定しています。
scale=1280:720:flags=lanczos+accurate_rnd
でスケーリングアルゴリズムを指定して横幅1280px、縦幅720pxのサイズでリサイズを指定しています。
scale=640:-1:flags=lanczos+accurate_rnd
でスケーリングアルゴリズムを指定して横幅640pxに合わせてアスペクトを保ったままリサイズする指定をしています。
crop=iw-0:ih-2*38
で上38px、下38pxをクロップ(トリミング)する指定をしています。
メモ
unsharp filter
左上: オリジナル
右上: デフォルト -vf "unsharp=lx=5:ly=5:la=1.0:cx=5:cy=5:ca=0.0:ax=5:ay=5:aa=0.0"
左下: ストロング -vf "unsharp=lx=7:ly=7:la=2.5"
右下: 輝度サイズMAX -vf "unsharp=lx=13:ly=13:la=1.5"
ノイズ除去 filter
左上: オリジナル
右上: hqdn3d filter -vf "hqdn3d"
左下: vaguedenoiser filter -vf "vaguedenoiser"
右下: nlmeans filter -vf "nlmeans"
ノイズ除去 + unsharp組み合わせ例
-vf "nlmeans=s=1.0:p=7:pc=5:r=3:p=3,unsharp=lx=7:ly=7:la=2.5"
-vf "atadenoise,hqdn3d=4,unsharp=7:7:0.5"
動画(mp4ファイル)にサムネイルを埋め込んでエクスプローラに表示する。
ffmpeg -i "movie.mp4" -i "thumb.jpg" -map 0:v -map 0:a -map 1:v -c copy -disposition:2 attached_pic "movie_thumb.mp4"
上記の方法でサムネイルを埋め込んだ動画(mp4ファイル)を元に戻す(サムネイルを外す)。
ffmpeg -i "movie_thumb.mp4" -map 0:v:0 -map 0:a -c copy "origin_movie.mp4"
FFmpegのダウンロード
最後にFFmpegのダウンロードの仕方からインストール、パスを通すための簡単な説明です。
FFmpegのダウンロードは下記から
⬆画像クリックでで拡大します⬆
1.まずは緑色のDownloadボタンをクリック
2.左下のGet the packages & executable filesのWindowsのアイコンにマウスを当てるとWindows Builds from gyan.devが出てくるのでWindows Builds from gyan.devをクリック
3.下にスクロールして、releaseの
https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full.7z
をクリック
4.お使いのブラウザに合わせて7zファイルをダウンロードして解凍します。
5.C直下にffmpegのフォルダを作り解凍したファイルの中身(bin,doc,presets,LICENSE.txt,README.txt)を移動します。
6.これでインストールは完了です。
7.次にffmpegにパスを通します。
8.エクスプローラーを開き、左側にあるPCを右クリック
9.出てきたメニューからプロパティをクリック
⬆画像クリックでで拡大します⬆
システムの画面が表示されるので右側にあるシステムの詳細設定>環境変数>新規をクリック
新しいユーザー変数に
変数名:path
変数値:C:\ffmpeg\bin
(c > コロン > バックスラッシュ > ffmpeg > バックスラッシュ > bin)
と入力しOKを押して完了です。
日本語環境ではバックスラッシュは円マークで表示されます。
これでffmpegにパスがいつでも通っている状態になりました。
以上でFFmpegの設定は完了です。
FFmpegはバージョンアップするたびに使い勝手が良くなってエンコードソフトとしては世界最高峰ではないでしょうか。
参考にさせていただきました。 Special Thanks
使用した動画素材はNHKクリエイティブライブラリー様からお借りしました。 Special Thanks
使用した画像素材はThe Lenna Story - www.lenna.org様からお借りしました。 Special Thanks