フォルダ内のMP4ファイルをリストアップし、ffmpegで1枚/秒の静止画を作成させるためのバッチファイルをPower Automate Desktopで生成します。
モチベーションはこんな感じ。
- セミナーやハンズオンの動画からドキュメントを起こすことがある
- 必要な個所のスクリーンショットをいちいち取得するのは意外と手間(スクショ操作→取得範囲指定→リサイズ)
- あらかじめ1枚/秒とかの静止画を生成し、まとめてリサイズ等をしておきたい
- ffmpegでできるのは分かってるけど、毎回やり方をググってしまうし、CLIでのファイル名やフォルダ名の指定が手間
フローのスクリプト
/# 指定されたフォルダ内のmp4ファイルから画像(1枚/秒)を生成するバッチファイルを作成します。
作成者:塚本牧生 <tsukamoto at gmail.com>
作成日:2021/12/24#/
# 対象フォルダの取得
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.MyPictures SpecialFolderPath=> SpecialFolderPath
Display.SelectFolder Description: $'''処理対象の動画があるフォルダを指定してください。''' InitialDirectory: SpecialFolderPath IsTopMost: True SelectedFolder=> SelectedFolder ButtonPressed=> ButtonPressed
IF ButtonPressed <> $'''OK''' THEN
EXIT Code: 0
END
# 対象ファイル群の取得
Folder.GetFiles Folder: SelectedFolder FileFilter: $'''*.mp4''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files
# 対象ファイルの処理
SET BatchText TO $'''chcp 65001
REM ffmpegにより動画(MP4)から静止画(JPEG)を生成します。
cd \"%SelectedFolder%\"
'''
LOOP FOREACH File IN Files
SET ImageFolder TO $'''%File.Directory%\\%File.NameWithoutExtension%'''
IF (Folder.IfFolderExists.DoesNotExist Path: ImageFolder) THEN
Text.AppendLine Text: BatchText LineToAppend: $'''mkdir \".\\%File.NameWithoutExtension%\"''' Result=> BatchText
END
Text.AppendLine Text: BatchText LineToAppend: $'''ffmpeg -i \".\\%File.Name%\" -r 1 \".\\%File.NameWithoutExtension%\\%%%%08d.jpg\"''' Result=> BatchText
END
File.WriteText File: $'''%SelectedFolder%.bat''' TextToWrite: BatchText AppendNewLine: False IfFileExists: File.IfFileExists.Overwrite Encoding: File.FileEncoding.UTF8NoBOM
Display.InputDialog Title: $'''サムネイル生成バッチ''' Message: $'''以下のバッチファイルが作成されました。''' DefaultValue: $'''%SelectedFolder%.bat''' InputType: Display.InputType.SingleLine IsTopMost: False
実行方法
以下のようにして、実行できます。
- Power Automate Desktopを起動。
- 「新しいフロー」を選択し、任意の名前(例えば
mp4_to_image
)を指定。 - エディターが開いたら、上のスクリプトをコピーし、エディタ領域で貼り付け。
- 「保存」してからエディターを閉じる。
- 「自分のフロー」に追加されているので、実行。
生成されたバッチファイルを実行すると、動画ファイルのある場所にファイルのベース名(拡張子のない名前)のフォルダが作成され、その中に1枚/秒の静止画が生成されます。
メモ
ffmpegによる静止画出力
ffmpegによる静止画出力は、ドキュメントによれば以下のようにすればできる。
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
-s WxH
はサイズ指定、 -f image2
は拡張子を見てよしなにしてくれてる感じで、元サイズのままでよければ以下でもできた(のでこれを採用している)。 -r
は1秒あたりに出力する静止画ファイル数で、これは指定しておかないとすごい枚数が出力されてしまう。
ffmpeg -i foo.avi -r 1 foo-%03d.jpeg
バッチファイルの文字コード
バッチファイルは文字コード周りにちょっと注意が必要。Power AUtomate Desktopやメモ帳で扱える文字コード範囲内では、以下のようにする。
- 文字コードはUTF-8(バイトオーダーマークなし)にする。
- バッチファイルの先頭行に
chcp 65001
を書いておく。
1点目は、テキストをファイルに書込む際に文字コード「UTF-8(バイトオーダーマークなし)」を選択することで対応している(最後の File.IfFileExists.Overwrite Encoding: File.FileEncoding.UTF8NoBOM
部分)。