【初投稿】FFmpegを使用した動画エンコード

 「この記事では、動画編集をプログラムで行うに当たり、PowerShellとFFmpegを使用して動画エンコード処理を自動化する方法について説明します。」

:::note warn
警告
！Qiita記事作成は初めてです。
！現在エンジニア目指して勉強中の30代男性です。
！主にChatGPTを使用して記事を作成しています。
！読みづらさ、内容の不明確さがあればどうかご勘弁ください。
:::

### 記事の内容の要約:
この記事では、PowerShellを使用して動画のエンコード処理を自動化する方法について説明します。具体的には、PowerShellスクリプトを使用して動画ファイルを指定の設定で処理し、エンコード後の動画をクラウドまたはローカルに保存します。


### 環境や前提条件:

・Windows環境でのPowerShellの使用を前提としています。
・動画エンコードにはFFmpegが必要です。インストールル手順は[公式サイト](https://ffmpeg.org/download.html)を参考にしています。
・PowerShell.exe
・IDE (筆者はVSCODEで作成)


## シーケンス図

![Diagram](https://mermaid.ink/img/pako:eNptk89uIyEMxl_F4ty8wBxySTK9rFaj5ZqLFzwJWgZY_mQ3qvruNcOkmabhZMGPzx-2eRPKaxKdSPS3kFO0N3iKOB0d8AoYs1EmoMswSMAERzH4fxTlmawFqaIJ-Si-w33f4HGcAp2eEfKaGsJBpukZsrO-6Aa1UGYf8UTP2B9eoW1sC1dsowe52W4H2cGeRuOIb-czW3AaRmPJ4UTpAXwlRxEzgS85lPzJrbC-70BSLgHaS0H5aWLNB-Twn1RhoWdQ32-Y4ip0MESvKCXjTnAxmnwD-Giz6PziVNFBuHORUrF5rVSdL0I1UbCU147nRLszqT_A7fa6iqSiKt4otBkODydjse3w5me7nTtyU1Jze2pFAS9oLP421uTr_U4V3X2DLN2JumZieYLEC0H2TfqOkU0EP_0q41eJuflrCVs37MoK3Qo_S32-dGRHtErExbpVa29SsHgFitFH4DlJdbDcIiZexERxQqP5F73V7aPIZ-IxER2HmkasHeI5fGcUS_by6pTociz0IkrQPGHLp_u6edCGZ1h0I7LR9w98GDAx?type=png "シーケンス図Diagram")

※画像がリンク切れになっている可能性あり。
※mermaidにて作成
※使用したGPTs
【Diagrams: Show Me 】[By helpful.dev]https://helpful.dev/



## PowerShellを使用したスクリプトの実行方法

この投稿では、PowerShellを使用してスクリプトを実行する方法について説明します。スクリプトは、特定のディレクトリに保存された動画ファイルに対してエンコード処理を行います。投稿の目的は、スクリプトの実行手順を明確にし、PowerShellでスムーズな操作が可能になるよう支援することです。

## 導入

1. スタートメニューから PowerShell を開きます。
2. スクリプトファイルが保存されているディレクトリに移動します。
3. スクリプトの実行許可を確認し、必要に応じて設定を変更します。
4. スクリプトを実行します。

## 目的と目標

この投稿の目的は、PowerShellを使用したスクリプトの実行手順を提供し、ユーザーがスクリプトを効果的に利用できるようにすることです。具体的な目標は以下の通りです：

- PowerShellを使ったスクリプト実行の手順を理解する。
- スクリプトの実行許可の設定方法を学ぶ。
- 動画エンコード処理をスクリプトで自動化する方法を理解する。

## PowerShellを使用した動画エンコードスクリプト

<!-- powershell -->
<details><summary>サンプルコード（open属性なし）</summary>

特定の開始時刻と持続時間で動画をトリミングし、サイズと視覚効果を調整した上で、指定のテキストをオーバーレイして、最終的にエンコードされた動画をクラウドかローカルストレージに自動保存する。


```powershell
# パスとファイル名を定義する
$input_file = "<input_file_path>"
$cloud_destination = "<cloud_destination_path>"
$local_destination = "<local_destination_path>"

# 動的にファイル名を生成する
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$output_file = "<output_file_path>"  # 拡張子 .mp4 を追加

# ffmpegコマンドでビデオを処理する
$ffmpeg_cmd = @(
    "<ffmpeg_executable_path>",
    "-ss", "00:06:25",  # 開始時刻を設定する
    "-i", $input_file,  # 入力ファイルを指定する
    "-t", "00:00:28",   # 処理時間を設定する
    "-vf", "scale=-2:720,eq=saturation=0.8:brightness=0.2,fade=t=in:st=0:d=0.6,fade=t=out:st=27.4:d=0.6,drawtext=fontfile='C:/ProgramData/anaconda3/Lib/site-packages/qtawesome/fonts/fontawesome5-solid-webfont.ttf':text='[Your_Text_Here]':fontsize=14:fontcolor=white:x=(w-text_w)/2:y=h-th-10",
    "-c:v", "libx264",  # ビデオコーデックを設定する
    "-profile:v", "high",  # プロファイルを設定する
    "-level", "4.0",   # レベルを設定する
    "-preset", "fast",   # プリセットを設定する
    "-b:v", "1200k",   # ビットレートを設定する
    "-bufsize", "2400k",   # バッファサイズを設定する
    "-maxrate", "1200k",   # 最大ビットレートを設定する
    "-af", "afade=t=in:st=0:d=0.6,afade=t=out:st=27.4:d=0.6",   # オーディオフェードを設定する
    "-c:a", "aac",   # オーディオコーデックを設定する
    "-b:a", "128k",   # オーディオビットレートを設定する
    "-f", "mp4",   # フォーマットを手動で指定する場合
    $output_file   # 出力ファイルを指定する
)

# ffmpegコマンドを実行する
Write-Output "動画を処理中..."
$process = Start-Process -FilePath $ffmpeg_cmd[0] -ArgumentList $ffmpeg_cmd[1..($ffmpeg_cmd.Length-1)] -NoNewWindow -Wait -PassThru

# エンコードが成功したかどうかをチェックする
if ($process.ExitCode -eq 0) {
    Write-Output "エンコードに成功しました."

    # クラウドへの保存を試みる
    if (Test-Path $cloud_destination) {
        Write-Output "クラウドへの保存中: $output_file -> $cloud_destination"
        Move-Item -Path $output_file -Destination $cloud_destination
    } else {
        Write-Output "ローカルに保存中: $output_file -> $local_destination"
        Move-Item -Path $output_file -Destination $local_destination
    }
} else {
    Write-Output "エンコードに失敗しました."
}
```

</details>

### PowerShellでスクリプトの実行

1. スタートメニューから PowerShell を開きます。
2. スクリプトファイルが保存されているディレクトリに移動します。例えば:

   ```powershell
     cd C:\Users\name\my_folder\Encode_Vscode\VideoProcessing\scripts
スクリプトを実行する前に、PowerShellでスクリプト実行が許可されていることを確認します。不確実な場合は、次のコマンドを実行してスクリプト実行を許可します：
 ```powershell
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force
  ```
このコマンドは、信頼できるソースからのスクリプトのみを実行するように設定し、強制的に実行ポリシーを変更します。

スクリプトを実行します：
 ```powershell
.\encode_video.ps1
 ```
これで、指定したパスにある動画ファイルに対してエンコード処理が行われ、出力ファイルが指定された出力ディレクトリに保存されます。エンコード処理が成功したかどうかは、PowerShellの出力を見て確認できます。

## まとめ
この投稿では、PowerShellを使用して動画ファイルに対するエンコード処理を行うスクリプトの実行手順を明確に説明しました。

しかしそもそも動画編集ソフトを使えばいいだろ！という話です...

動画編集ソフトは機能が豊富ですが、今回必要としているのは単にエンコーディングの自動化。この目的には、シンプルでコマンドベースのFFmpegの方が合っていると思い。プログラミングの勉強がてら書いてみました。