Como você roda um diretório inteiro de vídeos com o ffmpeg?

3

Sou novo no FFmpeg e estou tentando descobrir isso. Eu encontrei isso para processamento em lote e esta resposta para rotação do vídeo mas eu preciso colocá-los juntos.

Alguém poderia explicar como criar um script para essa ação no Windows?

    
por ThirteenthMonth 29.08.2017 / 21:10

1 resposta

2

Basicamente, você só precisa procurar os arquivos, armazená-los em uma variável e, em seguida, alimentar os arquivos pesquisados no FFmpeg.

É claro que a linguagem em lotes do Windows seria suficiente para isso . Mas como não tenho proficiência com isso, aqui está um Script do 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))
}

Este script executará o FFmpeg com o código que você forneceu (eu fiz não verifique, mas você pode facilmente substituí-lo de qualquer maneira) e salve o arquivo resultante na mesma pasta com o sufixo de nome "_ROTATE" - então "MyMovie2017.mov" se tornará "MyMovie2017_ROTATE.mov". (Se você quiser renderizá-los para uma pasta totalmente nova, substitua $($FilesToRotate[$i].ParentPath) pelo caminho que você gosta.)

Notas: as coisas com parênteses duplicados (( )) são opcionais:

  • -Filter só irá endereçar (um) tipo específico de arquivos, por exemplo * .mp4 só encontrará arquivos MP4. Se você tiver mais de um tipo de arquivo, mas muitos arquivos que não precisa converter (como arquivos de texto), você pode -Exclude todos os formatos que não deseja converter ou -Include somente aqueles que devem ser convertidos convertido ( -Include é como -Filter - é mais lento, mas pode incluir mais de um formato).
  • -Recurse também examinará subpastas. Você também pode usar -Depth com o PowerShell v 5 +.
  • -Wait abrirá uma instância de ffmpeg de cada vez - sem ela, todas as instâncias serão abertas em paralelo.
  • -NoNewWindow mostrará a saída de sua instância de ffmpeg no PowerShell-Console, enquanto sem ela, todas as instâncias do ffmpeg serão abertas em uma nova janela de console. Faz sentido apenas com -Wait .

Você terá que excluir todos os parênteses duplicados (e o conteúdo deles, se não quiser) antes de iniciar o script.

Além disso, essas coisas precisam ser adaptadas:

  • C:\PATH_TO_FILES Caminho para seus arquivos, obviamente.
  • C:\PATH_TO_FFMPEG\ffmpeg.exe Caminho para o seu ffmpeg.exe, obviamente.
  • rotate=<x> - você precisa substituir o <x> por 90 , 180 ou 270 . (Como explicado na fonte do código)

Se alguma coisa precisar de mais explicações, fico feliz em ajudar.

    
por 29.08.2017 / 23:05