ルモーリン

jpgとwavからmp4を作るバッチファイル

投稿:2023-03-09

fedibird(mastodon)でのトゥートに1枚絵に合成音声を足した動画を入れる機会が増えました。 デスクトップ上に写真と合成音声を置くようにしています。 アイコン2個を選択してメニュー選択で貼り合わせた動画を作りたい。

@echo off

setlocal enabledelayedexpansion

rem ffmpegでよく使うパラメタ
set acodec=
set scale=-vf scale=-2:1080
set overwrite=-y

call :progress ドロップしたファイルです。
set jpg_count=0
set jpg_path=
set wav_count=0
set wav_path=
set mp4_path=
set other_count=0
for %%i in (%*) do (
	echo "%%~i"
	set x=%%~xi
	if /i ".jpg" == "!x!" (
		set /a jpg_count+=1
		set jpg_path="%%~i"
		set mp4_path="%%~dpni.mp4"
	) else if /i ".wav" == "!x!" (
		set /a wav_count+=1
		set wav_path="%%~i"
	) else (
		set /a other_count+=1
	)
)

call :progress ファイル名をチェックします。
if /i 0 equ %jpg_count% (
	call :progress JPGファイルがありません。
	goto :results
)
if /i 0 equ %wav_count% (
	call :progress WAVファイルがありません。
	goto :results
)
if /i 0 lss %other_count% (
	call :progress 違うファイルが入ってます。
	goto :results
)
if /i 0 lss %jpg_count% (
	if /i 1 lss %jpg_count% (
		call :progress JPGファイルが2個以上です。
		goto :results
	)
	if /i 1 neq %wav_count% (
		call :progress WAVファイルが0個か2個以上です。
		goto :results
	)
)

rem 説明
call :progress 結合前後のファイル名です。
echo jpg:%jpg_path%
echo wav:%wav_path%
echo mp4:%mp4_path%

rem jpg+wav→mp4の場合
if defined jpg_path (
	call :progress 結合します。
	ffmpeg %overwrite% -i %jpg_path% -i %wav_path% %scale% %acodec% %mp4_path%
	call :progress 結合完了です。
	%mp4_path%
	call :progress 再生終了です。
)

:results
pause
exit /b 0

:progress
title %1
echo %1
goto :eof

右クリック「送る」の先に「jpgwav2mp4」を表示させます。

  1. バッチファイルのショートカットを作る
  2. ショートカットの名前を「jpgwav2mp4」に変更する
  3. 「送る」のフォルダ(*)にショートカットを移動する
  4. ffmpegをインストール、PATHに設定する

*:「送る」のフォルダ

まずデスクトップにあるファイルのプロパティ表示で場所を見て、
C:\Users\??????\Desktop
とすると
C:\Users\??????\AppData\Roaming\Microsoft\Windows\SendTo
が「送る」のフォルダになります。

jpgファイル1個、 wavファイル1個、 計2個を選択、 右クリック>送る>jpgwav2mp4を選択、 コンソールが表示されて動画ファイルの生成過程が表示、 jpgファイルと同名で拡張子がmp4の動画ファイルが生成されます。

まあ、細かい話は、他のバッチファイル関係の解説ブログ等を見てください(丸投げ)。 ざっくり説明します。

概要

アイコンを複数個選択した状態で「送る」メニューを使うとバッチファイルに選択したアイコンのファイル名が全部来ます。 一つずつ拡張子で振り分けて、個数をチェック、jpgからmp4のファイル名を作りffmpegを実行します。

拡張子で振り分け

for文で選択したファイル1個につき1ループします。 拡張子で場合分けして個数を数え、ファイル名を記録します。 jpgファイルの場合はmp4ファイル名を生成します。

ファイル数チェック

jpgが1個、wavが1個、その他が0個でパスするようにチェックします。 多すぎたり、少なすぎたり、別のファイルを選択していた場合はそれなりに表示します。

ファイル名表示

jpg/wav/mp4のファイル名を表示します。

貼り合わせ

ffmpegを呼び出して貼り合わせます。 バッチファイルの冒頭で設定した変数を利用します。

  • acodec:音声のオプション
  • overwrite:作り直した時にmp4ファイルがあると問い合わせで一時停止するのを抑止、上書きさせる
  • scale:高さを1080に、幅を縦横比を変えずに調整(ただし偶数ピクセルにする)

処理経過

時間がかかる処理用に常備するサブルーチンに処理経過があります。 コンソールの行に表示すると共にタイトルにも表示するものです。 画面が隠れていても、タスクバーにアイコンがありタイトルが表示されますから経過中の状況を見られます。