web-dev-qa-db-ja.com

ffmpegでビデオのディレクトリ全体をどのように回転させますか?

私はFFmpegに不慣れで、これを理解しようとしています。 バッチ処理 でこれを見つけ、 ビデオの回転 でこの答えを見つけましたが、それらをまとめる必要があります。

誰かがWindowsでこのアクションのスクリプトを作成する方法を説明できますか?

3
ThirteenthMonth

基本的には、ファイルを検索して(変数に格納し)、検索したファイルをFFmpegにフィードするだけです。

もちろん、 Windowsのバッチ言語で十分です 。しかし、私はそれについてまったく習熟していないので、PowerShellスクリプトを次に示します。

_# Searching for files with the Get-ChildItem cmdlet and saving their relevant properties in an array:
# NOTE: -File will only work with PowerShell-versions >= 3.
[array]$FilesToRotate = Get-ChildItem -Path "C:\PATH_TO_FILES" ((-Filter *.mp4)) ((-Recurse)) -File | ForEach-Object {
    # NOTE: This part is a bit tricky - I just added it so I'm able to save the parent-path of each file in an object.
    # NOTE: One could also omit the whole ForEach-Object and use the Split-Path cmdlet inside the output-file's specification in FFmpeg's code.
    [PSCustomObject]@{
        InFullName = $_.FullName
        # Will put the output-file in the same folder as the input-file and add "_ROTATION" as suffix in its name.
        OutFullName = "$(Split-Path -Parent -Path $($_.FullName))\$($_.BaseName)_ROTATE$($_.Extension)"
    }
}

# Processing the files with FFmpeg using PowerShell's Start-Process cmdlet:
for($i=0; $i -lt $FilesToRotate.Length; $i++){
    Start-Process -FilePath "C:\PATH_TO_FFMPEG\ffmpeg.exe" -Argumentlist " -i `"$($FilesToRotate[$i].InFullName)`" -c copy -metadata:s:v:0 rotate=<x> `"$($FilesToRotate[$i].OutFullName )`" " ((-Wait)) ((-NoNewWindow))
}
_

このスクリプトはFFmpegを 指定したコード (チェックしませんでしたが、とにかく簡単に置き換えることができます)で実行し、結果のファイルを同じフォルダーに名前サフィックス「_ROTATE」で保存します-したがって、「MyMovie2017.mov」は「MyMovie2017_ROTATE.mov」になります。 (それらをまったく新しいフォルダーにレンダリングする場合は、$($FilesToRotate[$i].ParentPath)を任意のパスに置き換えます。)

注:二重括弧_(( ))_内のものはオプションです:

  • _-Filter_は、特定の種類のファイル(1つ)のみを処理します。 * .mp4はMP4ファイルのみを検索します。複数のファイルタイプがあるが、変換する必要のないファイル(テキストファイルなど)が多い場合は、変換したくないすべての形式を_-Exclude_するか、_-Include_のみにすることができます。変換する必要があるもの(_-Include_は_-Filter_に似ています-速度は遅くなりますが、複数の形式を含めることができます。)
  • _-Recurse_はサブフォルダーも調べます。 PowerShell v 5以降では_-Depth_を使用することもできます。
  • _-Wait_は一度に1つのffmpegインスタンスを開きます-それがないと、すべてのインスタンスが並行して開かれます。
  • _-NoNewWindow_は、PowerShellコンソールでのffmpegインスタンスの出力を表示しますが、それがないと、ffmpegのすべてのインスタンスが新しいコンソールウィンドウで開きます。 _-Wait_でのみ意味があります。

スクリプトを開始する前に、すべての二重括弧(および不要な場合はその内容)を削除する必要があります。

また、これらのことを適応させる必要があります。

  • _C:\PATH_TO_FILES_明らかに、ファイルへのパス。
  • _C:\PATH_TO_FFMPEG\ffmpeg.exe_明らかに、ffmpeg.exeへのパス。
  • _rotate=<x>_-_<x>_を_90_、_180_、または_270_のいずれかに置き換える必要があります。 (コードのソースで説明されているように)

さらに説明が必要な場合は、喜んでお手伝いさせていただきます。

2
flolilo