powershellでffprobeが出力する動画の情報から音声コーデックを取得

コンピュータ
PowerShellのあれこれ

Start-Processで外部コマンドのffprobe.exeを実行しています。
欲しい情報は標準出力に出力されていますので、それを一度ファイルに出力してから読み込んで利用します。
フォーマットはJson形式にしていますのでConvertFrom-JsonでPowerShellのオブジェクトに変換しています。
外部コマンドの実行はSystem.Diagnostics.Processを直接生成する方法もあり、こちらだと標準出力をファイルに出力しない方法も可能ですが、出力が多量の場合対応が必要です。その対応がPowerShellだと面倒なので標準出力をファイルに書き出した方が無難な感じです。(遅いし、回りくどいですが…)

スクリプト

<#
.SYNOPSIS
 powershellでffprobeが出力する動画の情報から音声コーデックを取得  (Start-Processのサンプル)
#>
using namespace System.IO

param($FilePath = "H:\tools\WPy64-3740\python-3.7.4.amd64\Lib\site-packages\imageio\resources\images\realshort.mp4")

function GetAudioCodeName {
    param($MoveFile)

    $FFprobePath = "H:\tools\ffprobe.exe"
    $Arguments = "-show_streams -of json " + $MoveFile
    $StdOutPath = [Path]::GetTempFileName()
    $StdErrPath = [Path]::GetTempFileName()

    $ret = Start-Process -FilePath $FFprobePath -ArgumentList $Arguments -RedirectStandardError $StdErrPath -RedirectStandardOutput $StdOutPath -NoNewWindow -Wait -PassThru


    $errText = Get-Content $StdErrPath
    $outText = Get-Content $StdOutPath

    rm $StdErrPath
    rm $StdOutPath

    if ($ret.ExitCode -eq 0) {
        #Write-Host "正常終了"
        ($outText | ConvertFrom-Json).streams | ? { $_.codec_type -eq "audio" } | Select-Object -First 1 | % { $_.codec_name }

    } else {
        ""
    }
}

GetAudioCodeName $FilePath

今回はオーディオコーデックを取得しましたが、ffprobeの結果がpowershellのオブジェクトにしてありますので、他の項目もプロパティを選ぶことで同様に取得することが出来ます。

コメント