Askthewind’s diary

個人的なメモ

FFmpegの使い方

f:id:Askthewind:20190319185045j:plain

FFmpegエンコード設定と基本的な使い方

FFmpegの基本的な使い方とエンコード設定のコマンド例をまとめました。最後にFFmpegのダウンロードの仕方からインストール、パスを通すまでの簡単な説明と画像を載せてあります。

FFmpegの起動の仕方

まずは、FFmpegを起動するために、コマンドプロンプトffmpeg.exeが置いてある場所までディレクトリ移動(ディレクトリを指定する)します。

f:id:Askthewind:20190319194451p:plain

f:id:Askthewind:20190319195146p:plain

f:id:Askthewind:20190323091501p:plain

c直下のフォルダffmpeg内のbinフォルダにffmpeg.exe、ffplay.exe、ffporbe.exeが入っている場合、
cd c:\ffmpeg\bin
と入力し最後にエンターキーを押します。
cd > 半角スペース > c > コロン > バックスラッシュ > ffmpeg > バックスラッシュ > bin > エンターキー(押す)

日本語環境ではバックスラッシュはコマンドプロンプトでは円マークで表示されます。

f:id:Askthewind:20190319185528p:plain

上記の画像のように次の行が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とします。

上記のコマンドをコマンドプロンプトにコピペ又は打ち込みエンターキーを押します。

f:id:Askthewind:20190319190613p:plain

f:id:Askthewind:20190319190719p:plain

すると上記の画像のようにffplayが起動してエンコード前の出力動画のプレビューが出来ます。ffplayの位置やサイズはマウスで調整できます。ここではmp4ファイルを使用しましたがavi,flv,mov,mp4,mkv,ts,wmv,etcほぼ全てのコーデック形式に対応しています。

ffplayにパイプを通して音声つきでプレビューするには-f matroska - | ffplay -i -
コマンドが大変便利です。

ffplayにパイプを通して音声つきでプレビューするコマンド

-f matroska - | ffplay -i -

ネットでの再生環境へ最適化してmac等の他のデバイスでも再生出来るようにエンコード

それでは実際に動画をエンコードするコマンドを以下に示します。このソースコードyoutube等の動画を作成する時にも使える便利なサンプルコードです。又、macwindows media player等でも不具合なく再生できます。

ffmpegエンコード

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、半角スペース、ファイルのある場所とファイル名を上記のように記述(円マークではなくスラッシュで区切ります)してクォーテーションで囲みます。結合(連結)する動画は同じ解像度、同じコーデック形式である必要があります。記述した順番にファイルを結合(連結)します。

f:id:Askthewind:20190322042544p:plain

FFmpegで無劣化結合(連結) 絶対パス

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で無劣化結合(連結) 相対パス

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

FFmpegGPUエンコード(ハードウェアエンコード)するコマンド例

FFmpegGPUエンコード(ハードウェアエンコード)する場合のコマンド例です。

グラフィックボードが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を使用すると綺麗に変換できるので個人的にオススメです。

f:id:Askthewind:20190320015429j:plain

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画像をリサイズしてグレースケールにする

f:id:Askthewind:20190320015859j:plain

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

f:id:Askthewind:20220326205459g:plain

f:id:Askthewind:20220326205638g:plain

f:id:Askthewind:20220326205724g:plain

左上: オリジナル
右上: デフォルト -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のダウンロードは下記から

www.ffmpeg.org

f:id:Askthewind:20210205013020g:plain

⬆画像クリックでで拡大します⬆

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)を移動します。

f:id:Askthewind:20190323082246p:plain

 

6.これでインストールは完了です。

7.次にffmpegにパスを通します。

8.エクスプローラーを開き、左側にあるPCを右クリック

9.出てきたメニューからプロパティをクリック

 

f:id:Askthewind:20210202235027p:plain

f:id:Askthewind:20210203114609p:plain


⬆画像クリックでで拡大します⬆

システムの画面が表示されるので右側にあるシステムの詳細設定>環境変数>新規をクリック
新しいユーザー変数に
変数名:path
変数値:C:\ffmpeg\bin

(c > コロン > バックスラッシュ > ffmpeg > バックスラッシュ > bin)
と入力しOKを押して完了です。

日本語環境ではバックスラッシュは円マークで表示されます。

これでffmpegにパスがいつでも通っている状態になりました。

以上でFFmpegの設定は完了です。

FFmpegはバージョンアップするたびに使い勝手が良くなってエンコードソフトとしては世界最高峰ではないでしょうか。

参考にさせていただきました。 Special Thanks

hfuji.hatenablog.jp

nico-lab.net

stackoverflow.com

linuxcreative.com

使用した動画素材はNHKクリエイティブライブラリー様からお借りしました。 Special Thanks

www.nhk.or.jp

使用した画像素材はThe Lenna Story - www.lenna.org様からお借りしました。 Special Thanks

www.lenna.org