Codifica ou copia condicionalmente o fluxo de áudio usando o FFMpeg

1

Estou tentando converter em lote um conjunto de arquivos de vídeo em que alguns têm áudio aac e alguns têm wav, PCM bruto ou outros formatos semelhantes.

Estou procurando uma maneira de:

  • Copie o fluxo de áudio, se já estiver em aac ( -c:a copy )
  • Codifique novamente o fluxo de áudio para aac se ainda não estiver aac ( -c:a aac -b:a 160k )

Minha abordagem atual é identificar manualmente quais arquivos não têm o fluxo de áudio aac e convertê-los separadamente, mas seria interessante converter todos os arquivos juntos.

Existe uma maneira de inserir uma instrução condicional para o áudio em um comando FFMpeg como o seguinte?

for f in *.mkv; do
    ffmpeg -i "$f" -c:v libx264 -c:a [some magic here] "${f%.*}_new.mkv"
done
    
por Ananda Mahto 18.02.2017 / 04:40

2 respostas

5

Não há uma instrução condicional em ffmpeg para codificar ou transmitir a cópia se a entrada não for um formato específico. No entanto, você pode usar ffprobe para determinar o formato de áudio e, em seguida, usar ffmpeg para codificar ou transmitir o áudio.

Aqui está um script simples demonstrando como fazer isso. Copie e salve, conceda permissão de execução com chmod +x yourscriptname e execute-o com ./yourscriptname input.foo :

#!/bin/bash

audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$1")

if [ "$audioformat" = "aac" ]; then
  ffmpeg -i "$1" -c:v libx264 -c:a copy "${1%.*}_new.mkv"
else
  ffmpeg -i "$1" -c:v libx264 -c:a aac "${1%.*}_new.mkv"
fi

Você pode modificar isso facilmente para atender às suas necessidades.

    
por 18.02.2017 / 09:30
2

Este é um problema surpreendentemente sutil. Demorei bastante e muitos passes para resolver todos os casos de canto. Eu coloquei minha solução online aqui .

Meu caso de uso específico está gerando *.mp4 arquivos para reprodução em um iPad Air 2 usando o macOS, mas as ferramentas usadas geralmente estão disponíveis no Linux, e a solução é facilmente adaptada a outros tipos de dispositivos.

Aqui estão algumas das minhas anotações sobre como fazer essa adaptação, na página inicial do projeto:

O projeto consiste em três scripts de shell Bash que geram ffmpeg , ffprobe , mediainfo e atomicparsley para converter arquivos de qualquer tipo suportados por esses programas em arquivos H.264 * .mp4 adequados para reprodução em um dispositivo de classe iPad Air 2.

Os scripts contêm alguns macOS isms, portanto, os scripts precisarão de algum ajuste para uso no Linux ou para uso no Windows, no Cygwin , MSYS ou WSL :

  1. O programa rmtrash age como rm exceto que os arquivos são movidos para a pasta Lixeira do usuário. Muitas ferramentas semelhantes existem para outros sistemas, ou você poderia simplesmente substituir esta linha em ipad-h264 por uma chamada rm ou algum outro tipo de comando "sair do caminho".

  2. O open call é um mecanismo macOS para abrir um arquivo usando o programa GUI associado a ele. Eu tenho arquivos *.mp4 associados a Subler aqui porque o próximo passo após remuxar ou transcodificação é olhar as tags, aplicar a capa, No Cygwin, você pode obter o mesmo efeito com cygstart . Eu suponho que há uma maneira de obter um efeito semelhante no Linux. Como alternativa, você poderia simplesmente codificar a próxima etapa no lugar do meu comando open .

Você pode baixar o software do repositório usando os links da seção Downloads da página inicial.

    
por 18.02.2017 / 05:26