管理人は職業柄、動画を扱うことが多く、以下のようなことを思うことがありました。
重い動画を手っ取り早く軽くしたいな
動画のこの範囲だけ切り取りたいな
gif動画にしたいな
それ、ffmpegでできます
ソフトを探せばこれらの要件を満たすもの(例えば、切り取りなら「ビデオエディター」gif化するなら「ScreenToGif」だったり)はあるのですが、面倒くさがりなので、出来ればソフトの行き来なく楽に・早くでできるものがないか探していた所、今回紹介するFFmpegに辿り着きました。
こんな感じで使えます(後半で説明する、バッチを使った例です)
セットアップに少し手間がかかるものの、一度行ってしまえばその後はすごく楽になるので、今回はその方法を書こうと思います。
※念のため、参考にされる方は自己責任でお願いします。
FFmpegとは?
FFmpegは、動画や音声を扱うフリーソフトウェアです。
GUIを持たず(ウィンドウを出して、UIを表示したりはしない)、コマンドなどから使用します。
こう聞くと難しく思いますが、実際に使うと思ってるよりも簡単です。
順をおって説明しますので安心していただければ!
ダウンロード
【https://ffmpeg.org/】にアクセスします。
Download をクリック
「Windows Builds from gyan.dev」 をクリックします。
以下の理由から、安定していると思われる↑を選択しています。
「Windows Builds from gyan.dev」… リリースビルド(最適化、バグ修正などされたもの)
「Windows Builds from gyan.dev」… オートビルド(ソースコード変更があるたびに頻繁に更新される)
「ffmpeg-release-essentials.zip」 をダウンロードします。※スクリーンショットは 2023/10時点のもの
インストールと使用方法
リネームとフォルダ移動
zipを解凍してできたフォルダ(「ffmpeg-6.0-essentials_build」といった名前)を「ffmpeg」という名前にリネームしてください。
リネームしたフォルダをProgram Files直下に移動してください。
後述の環境変数への登録時に必要になるので、binフォルダまでいってパスをコピーしてください。
環境変数「PATH」に登録
コマンドでFFmpegを使用するため、↑のフォルダ内のffmpegの実行ファイルを環境変数に登録する必要があります。
環境変数とは、プログラムやシステムの動作に関連するさまざまな情報を持っているものです。
今回はこの中の「PATH」という、ファイルの場所を指定するところに登録します。
これによって、コマンドでFFmpegが使用できるようになります。
Windowsキーを押下して、「env」と入力。そのままEnterキーを押下するか、表示された「環境変数を編集」をクリックしてください。
出てきたウィンドウの「環境変数」ボタンをクリックしてください。
システム環境変数という項目の「PATH」を選択してダブルクリック、もしくは「編集」をクリックしてください。
ウィンドウが開いたら、
1. 「新規」ボタンをクリック
2. 先程コピーしたパス「C:\Program Files\ffmpeg\bin」(例) をペースト
3. 「OK」ボタンをクリックしてウィンドウを閉じてください。
開いていた、以下ウィンドウも「OK」ボタンをクリックして閉じてください。
(「env」を探したときと同じ要領で)
Windowsキーを押下して、「cmd」と入力。そのままEnterキーを押下するか、表示された「コマンドプロンプト」をクリックしてください。
表示されたウィンドウに「ffmpeg」と入力してください。
以下のような画面が表示されたら、インストールは完了です!
黒いし文字多いな…
慣れるとこういうものと思えるので、いまは心を無にしてください
コマンドプロンプトは今後も使うので、スタートやタスクバーにピン留めしてしまいましょう。
使ってみる(コマンドプロンプトで実行)
コマンドプロンプトを立ち上げ、テストしてみます。
今回は「mp4動画をmov動画に変換する」というのをやってみます。以下のような文字列(コマンド)を作成します。
“”内の部分を置き換えてください。
※コードの内容については、「バッチファイルの作成 – コードの解説」で解説しています。
ffmpeg -i "mp4動画のパス" "mov動画を作成するパス"
↓例えば、以下のようになります。
ffmpeg -i "D:\movie\test.mp4" "D:\movie\test.mov"
上記のコマンドを入力して、Enterを押下します。
以下のようにコマンドプロンプト上で処理が走り、「test.mov」が作成されました!
このように、1行のコードで動画を様々な形で編集・変換が行えます。
ここまでで、一通りの作業は終わりです。
便利だけど、毎回この作業するのメンドクサイな…
わかります
これらの処理を簡略化するため、ファイルをドラッグアンドドロップして実行する「バッチファイル」を作成します。
また、それを右クリックメニューから実行できるように登録します。
バッチファイルの作成と右クリックメニューへの登録
聞いたことがある方もいるかと思いますが、バッチファイル(バッチ処理)とは「複数の処理をひとつにまとめて自動的に実行する」という意味になります。
これを使うことで、前項で説明したコマンドプロンプトを立ち上げてコマンド入力する作業を簡略化することができます。
ここでは、そのバッチファイルの作成と、エクスプローラー上で右クリックした際の「送る」メニューにこのバッチを登録する方法を説明します。
バッチファイルの作成
前項で行った「mp4動画をmov動画に変換する」機能に加えて、「複数のmp4動画をドラッグアンドドロップした際に、1つずつその処理を行う」機能をつけます。
それが以下のコードになるのでコピーしてください。
※ 次の項でコードの解説をしています
@echo off
:REPEAT
rem ここにバッチ処理するコードを記述します
ffmpeg -i "%~nx1" "%~n1.mov"
if "%~2"=="" goto END
shift
goto REPEAT
:END
echo 処理完了
pause
エクスプローラー上でテキストファイルを作成してリネームします。
ここでは「MP4toMOV.bat」とします ※これでバッチファイルとして扱われるようになります。
このファイルを右クリックして、テキストエディタ(メモ帳など)で開きます。
管理人は Sakuraエディタ を使用しています。
そのうえで、先ほどコピーしたコードを貼り付けて保存します。
これでバッチファイルの完成です。
このバッチファイルにmp4動画ファイルをドラッグアンドドロップすると、movファイルに変換されたものが同フォルダに出来たらOKです!
複数ファイルのドラッグアンドドロップも出来ます。
バッチ実行完了後に、何かキーを押下する確認が入ります。これが不要な場合(完了後にこのウィンドウを自動で閉じる)は、バッチのコードの最後の行を「rem pause」としてください。
ただ、これだと何かエラーが出た場合でもウィンドウが閉じてしまうので、変換がうまくいかない時は「pause」に戻してください。
コードの解説
概要
コードの内容について、少しだけ解説します。
概要としては、以下のような感じです。
ffmpegに関するコード
大きく2つの要素で構成されていて、まずffmpegに関するコードです。
コマンド | 内容 |
rem | コメントアウトする(コード中にコメントを書く) |
ffmpeg | ffmpegを呼び出す |
-i | ファイルを読み込む(この-を含む文字はオプションといいます) |
“%~nx1” | 読み込むファイルのパス |
“%~n1.mov” | 変換して出力するファイルパス |
パスを””で囲っているのは、ffmpegは扱える文字に制限(スペースやハイフン)があるので、それを防止するために行っています。
[%~nx1] [%~n1] について
[%~nx1] [%~n1] という呪文のような部分は、バッチに渡された情報(引数)から様々な情報を展開するためのコマンドになります。
今回でいうとドラッグアンドドロップしたファイルのパスから、ファイル名などを取得しています。
例えば「C:\test\movie.mp4」というファイルをドラッグアンドドロップした場合、以下のようになります。
コマンド | 内容 | 結果 |
%1 | バッチに渡されたファイル | C:\test\movie.mp4 |
%~n1 | %1 をファイル名に展開 | movie |
%~x1 | %1 をドット付きの拡張子に展開 | .mp4 |
%~nx1 | %1 をファイル名と拡張子に展開します | movie.mp4 |
複数ファイル処理に関するコード
ドラッグアンドドロップしたファイル数分REPEATを実行して、全ての処理が終わったらENDに移動し、処理が完了となる作りになっています。
コマンド | 内容 |
@echo off | このコマンドを使用しない場合、コマンドプロンプト上にコマンドの内容が全て 反復表示されてしまいます |
:REPEAT | 10行目のgoto REPEATまでの内容を、1ファイルごとに実行します |
if “%~2″==”” goto END | 引数%2が空の場合は、ENDブロックまで移動します |
shift | 引数をずらします(+1)。これによって%1には ドラッグアンドドロップしたファイルが順番に入ることになります |
goto REPEAT | 3行目のREPEATブロックまで移動します |
:END | 処理が全て終わると、このブロックが開始します |
echo 処理終了 | 「処理終了」の表示がされます |
pause | 一時停止処理 |
まるで呪文のようだ…
独特ですよね、これも慣れです…
右クリックで実行できるようにする
前述のやり方だと、変換したいファイルをバッチにドラッグアンドドロップする作業が発生するのと、ドラッグアンドドロップできるようにバッチをエクスプローラー上で見えるようにしておく必要があり、少し不便です。
なので、変換したいファイルを右クリックメニューからバッチで変換できるようにします。
そのためにバッチを「送る」メニューのフォルダに登録(格納)します。
エクスプローラーアドレスバーに「shell:sendto」と入力してEnterを押下すると、「送る」メニューのフォルダにジャンプします。
※正確なアドレスは「C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\SendTo」です。
ここに、先ほど作ったバッチファイルを移動します。
変換したいファイルを右クリック > 送る > MP4toMOV.bat が表示されています。
クリックして、変換が実行されていればOKです!
使用頻度が高そうなコマンドおよびバッチの紹介
使用頻度が高そうな機能のバッチを作成します。複数ファイルのドラッグアンドドロップに対応しています。
作成したものは、前述の「右クリックで実行できるようにする」の方法で右クリックメニューにも登録して使えます。
動画を軽量化する
品質設定を行いながら動画を軽量化して出力するバッチです。
-crf オプションの後の数字で品質を設定していて、品質が高いほど容量が増えます。
23がデフォルト値で、数値が高いほど品質が下がり/容量も下がり、低いほど品質が上がり/容量も上がります
@echo off
:REPEATS
rem 品質/容量に応じて、crfの部分の数字を変更してください
ffmpeg -i "%~nx1" -c:v libx264 -preset veryfast -b:a 128k -crf 23 "%~n1_reduce.mp4"
if "%~2"=="" goto END
shift
goto REPEAT
:END
echo 処理完了
pause
動画を切り取る
時間を指定して、動画を切り取るバッチです。
切り取り開始/終了時間を入力→「cut_start」「cut_end」変数に格納して、その値で切り取った動画を出力します。
オプションの「-ss」が開始時間、「-to」が終了時間になります。
値は「01:00:10」や「01:00:10.500」といった形で入力します。
@echo off
:REPEATS
rem 切り取り範囲の指定
set cut_start=
set cut_end=
set /p cut_start="切り取り開始時間 > "
set /p cut_end="切り取り終了時間 > "
rem ffmpegの処理
ffmpeg -i "%~nx1" -vcodec copy -acodec copy -ss %cut_start% -to %cut_end% "%~n1_cut.mp4"
if "%~2"=="" goto END
shift
goto REPEAT
:END
echo 処理完了
pause
時間を入力する場合の値出しは MPC-BE を使った方法がおすすめです。
MPC-BE上で、Ctrl + G キーを押すことで現在の時間が表示されるので、
それをコピーして貼り付けるのが楽かと思います。
gif動画に変換する
動画をgif化するバッチです。
そのまま変換するとファイルが重くなるため、20fps、横解像度の上限を500px(この値を超えると500pxに収められる)としています。
@echo off
:REPEATS
rem ffmpegの処理(20fpsで、横解像度の上限は500px)
ffmpeg -i "%~nx1" -filter_complex "[0:v] fps=20,scale=min(500\,iw):min(-2\,iw),split [a][b];[a] palettegen [p];[b][p] paletteuse=dither=none" "%~n1.gif"
if "%~2"=="" goto END
shift
goto REPEAT
:END
echo 処理完了
pause
時間を指定したい場合は、ffmpegのコマンドを以下に差し替えてください。
直打ちですが、変数にしたい場合は前述の「動画を切り取る」を参考に、バッチファイルを書き換えてみてください。
ffmpeg -i "%~nx1" -filter_complex "[0:v] fps=20,scale=min(500\,iw):min(-2\,iw),split [a][b];[a] palettegen [p];[b][p] paletteuse=dither=none" -ss 00:00:00 -to 00:00:10 "%~n1.gif"
最後に
以上になります、お疲れ様でした!
ffmpegを使うならバッチ化まで解説したいと思い、かなり長くなってしまいましたが、
お付き合いありがとうございました。
管理人はチャットツールやコンフルなどに動画を上げる際、今回紹介したようなバッチを
使用して効率化を図っています。
ffmpegはコマンドさえ変えれば動画に対して様々な処理が行えるので、興味があれば
Google検索で「ffmpeg」と「やりたいこと」を組み合わせたワードで検索してみたり、
ChatGPTで「ffmpegで~なことをやりたいのでコードを教えて」と聞いてみるのもアリかと思います。
今後もこういった作業が少し楽になるツールや機能を紹介していきたいと思うので、よろしくお願いします!
コメント