Power Automate Desktop mp4からgif動画への変換を少し楽にする

## 概要

文章の中で動画使って説明したいときがあります。そんなときキャプチャした動画をgifに変換するケースがあるのですが、Power Automate DesktopとFFmpegを組み合わせたフローを作っておくと便利です。ファイルを選択して幅とフレームレートを入力するだけで変換できるようにします。Qiitaではがmp4使用できないので下図のようにgifに画像にすることが多いです。
![Convertedff.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/111589b9-0571-797b-13a8-b6d7cab28924.gif)


## 環境

* Widows 10 pro 21H1
* Power Automate Desktop 2.13.138.21255
* FFmpeg version N-103787-ga487635b85-20210922

## 注意事項

* FFmegをインストールする必要があります。
* 自己責任でお願いいたします。
* 2021年9月の情報です。

## FFmpeg

### FFmpegについて

FFmpegはコマンドラインツール(CUI)です。

https://ja.wikipedia.org/wiki/FFmpeg

### FFmpegインストール

何らかのアプリをインストールしたときに一緒にインストールされる場合もありますが、（自分はImageMagickを入れたときにインストールされていました）個別にインストールしてパスを通す方法です。

[公式ページ](https://ffmpeg.org/)のDownloadページからWindows EXE Filesでビルド済みのものをダウンロードします。Windows builds by Btbをクリックしてリンク先に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/967e542a-3a92-730d-d1f4-ab3f8e3cb78c.png)

リンク先はBtbN様のGithubになっているのでffmpeg-N-103790-g447cf53774-win64-gpl.zipをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/990b78ff-06dc-50f3-e1ed-3f1933a2cf3c.png)

解凍するとbinフォルダーの中にffmpeg.exeがあるので適当なフォルダーを作ってコピーします。私は‪C:\にFFmpegという名前でフォルダーを作ってそのなかにffmpeg.exeを入れておきました。インストールは以上です。
パスの通し方はファイル名を指定して実行からsysdm.cplと入力しシステムのプロパティを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/33b8584c-ec44-26aa-22da-0bb35aea7373.png)
詳細設定タブに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/65a35276-9441-ad42-4607-2b43ee526d1e.png)
環境設定に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/10f1ae40-5e59-89fc-95c8-05e31440acc3.png)
システム環境変数＞Pathを選択して編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/2dd81773-4bb1-1a92-16fd-4b5ff0e023e4.png)
参照ボタンを押してインストールで作成したフォルダーを選択しパスC:\FFmpegを追加します。
OKで閉じます。
パスが追加されたか確認します。
ファイル名を指定して実行でcmdと入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/75149cb9-4c86-5f86-e99d-d94f92c826aa.png)

コマンドプロンプトにffmpegと入力しFFmpegのバージョンが返ってくればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/fe1d717b-36ea-1ecb-95b2-1dac283a2ea2.png)
裏でPower Automate Desktopが立ち上がっている状態だと既にcmdが読み込まれているためPathを追加しても読み込めません。そのためタスクバーからPower Automate Desktopを終了させるかPCを一度再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/db733e62-b7a4-c112-fe52-32780ca62d8a.png)

## フロー作成

今回のポイントはDOSコマンドの実行アクションでmp4からgifに変換するコマンドを実行します。FFmpegはファイル名にスペースや拡張子以外のドットがあるとうまく動作しません。そこで一時フォルダーにファイルコピー後、ファイル名を変更、FFmpegで変換します。コピーした一時ファイルは削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/a3a74d99-20d5-f221-f25e-7a8871ea7b4a.png)

1. 特別なフォルダーを取得
   デスクトップパスを取得します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/6279cf71-2159-7727-7669-591d72647013.png)
2. Windows環境変数を取得
   一時ファイルを保存するフォルダーパスを取得します。
   ![2021-09-24-01-35-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/5c5848c0-9aa4-c9eb-41b1-5bcf0fbfd0f2.png)

3. ファイル選択のダイアログを表示
   初期フォルダーを`%SpecialFolderPath%`ファイルフィルターを`*.mp4`にしています。
   ![2021-09-24-01-36-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7c1a28cb-3c93-0146-2fe6-cfb8ae940b01.png)

4. If
   Cancelボタンを押したときフロー終了するようにします。
   ![2021-09-24-01-36-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/8a4e1976-bb1f-9504-8aa6-0b3521ddb68e.png)

5. Stop flow
   ![2021-09-24-01-36-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9e6d1fdb-b31f-fce4-5b29-8581fd73f806.png)

6. End
7. 入力ダイアログを表示
   gif動画の幅を入力できるようにします。デフォルト値を800ピクセルにしました。
   ![2021-09-24-01-38-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/2f46ded7-530d-4798-66c0-ef1bab8c14e9.png)

8. 入力ダイアログを表示
   gif動画のフレームレートを指定します。デフォルト値は20にしました。
   ![2021-09-24-01-39-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/6202cac9-ad55-ba36-274e-7a68662d5aab.png)

9.  テキストの解析
    正規表現でファイル名から記号やスペースを抜いてしまいます。ファイル名が日本語の場合一時ファイルのファイル名はなくなってしましますが問題ないようです。その場合の出力ファイル名はConverted.gifです。
    ![2021-09-24-01-39-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b6913509-3b69-0914-6b6a-f83c70d4f61e.png)

10. テキストの結合
    ![2021-09-24-01-41-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/cb1cdc0c-5730-b3ef-8b1b-c386c7b54942.png)

11. ファイルのコピー
    選択ファイルを一時フォルダー（TMP）にコピーします。生成される変数はリストなので注意が必要です。1つのファイル選択処理するので[0]を使います。
    ![2021-09-24-01-41-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/aff43c96-d996-b195-d49c-180c2c894770.png)

12. ファイルの名前を変更する
    `%CopiedFiles[0]%`をファイル名`TmpMovie`に書き換えます。出力される変数はリストなので注意が必要です。
    ![2021-09-24-01-42-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/564cf067-3948-dcf6-7fda-74b2eecc7b5a.png)

13. DOSコマンドの実行
    DOSコマンドは次のようにしました。`vf scale=%Width%:-1`で幅と高さの比率を元動画と同じまま、入力した幅にリサイズしています。`-r %UserInput%`はフレームレートです。少なくするとファイルサイズも軽くなります。変換されたファイルはデスクトップに保存されます。ファイルをフルパスで指定しているので作業フォルダーは必要ありません。
    )![2021-09-24-01-42-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/c5d8192c-76fe-0aa4-4868-f784c57de825.png)

    
```
ffmpeg -i %RenamedFiles[0]% -vf scale=%Width%:-1 -r %UserInput% %SpecialFolderPath%\Converted%JoinedText%.gif

```
14. ファイルの削除
    一時フォルダーにコピーしたファイルを削除します。
    ![2021-09-24-01-44-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b7f0a3b2-8411-5043-eecc-4dcd9145703f.png)

```r:PowerAutomateDesktop
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath
System.GetEnvironmentVariable Name: $'''TMP''' Value=> EnvironmentVariableValue
Display.SelectFile InitialDirectory: SpecialFolderPath FileFilter: $'''*.mp4''' IsTopMost: False CheckIfFileExists: False SelectedFile=> SelectedFile ButtonPressed=> ButtonPressed
IF ButtonPressed = $'''Cancel''' THEN
    EXIT Code: 0
END
Display.InputDialog Message: $'''Widht?''' DefaultValue: 800 InputType: Display.InputType.SingleLine IsTopMost: True UserInput=> Width ButtonPressed=> ButtonPressed
Display.InputDialog Message: $'''フレームレートは？''' DefaultValue: 20 InputType: Display.InputType.SingleLine IsTopMost: False UserInput=> UserInput ButtonPressed=> ButtonPressed
Text.RegexParse Text: SelectedFile.NameWithoutExtension TextToFind: $'''[a-z|0-9]+''' StartingPosition: 0 IgnoreCase: True Matches=> Matches
Text.Join List: Matches Result=> JoinedText
File.Copy Files: SelectedFile Destination: EnvironmentVariableValue IfFileExists: File.IfExists.Overwrite CopiedFiles=> CopiedFiles
File.Rename Files: CopiedFiles[0] NewName: $'''TmpMovie''' KeepExtension: True IfFileExists: File.IfExists.Overwrite RenamedFiles=> RenamedFiles
System.RunDOSCommand DOSCommandOrApplication: $'''ffmpeg -i %RenamedFiles[0]% -vf scale=%Width%:-1 -r %UserInput% %SpecialFolderPath%\\Converted%JoinedText%.gif''' StandardOutput=> CommandOutput StandardError=> CommandErrorOutput ExitCode=> CommandExitCode
File.Delete Files: RenamedFiles[0]
```

## まとめ

gif変換でWebのサービスを使うのも面倒だし毎回コマンドも忘れてしまうのでちょっと便利につかっています。サイズや容量を好みで調整できます。
いろいろなCUIツールでもコマンドを変数部分を入力できるようにPower Automate Desktopでフローを作っておくと楽できますよ！

## 参考

https://ja.wikipedia.org/wiki/FFmpeg

https://ffmpeg.org/

https://trac.ffmpeg.org/