Desentrelaçamento em massa com o FFmpeg no Debian

2

Eu tenho cerca de 300 vídeos, em um servidor Debian, armazenados da seguinte maneira:

/mediaroot/1/m32.mp4
/mediaroot/2/m421.mp4
/mediaroot/n/mx.mp4

Todos precisam ser desentrelaçados, e eu quero fazer isso com o FFmpeg.

Com a ajuda de outra solitária útil, alcancei um resultado razoavelmente tolerável com as seguintes etapas:

  1. extrair áudio
  2. transcodificar vídeo, exemplo

    ffmpeg -y -i m148.mp4 -pix_fmt yuv420p -an -pass 1 -passlogfile m148.x600.1351896878.log -an -vcodec libx264 -b:v 600k -preset medium -tune film -threads 0 m148.x600.1351896878.mp4
    ffmpeg -y -i m148.mp4 -pix_fmt yuv420p -an -pass 2 -passlogfile m148.x600.1351896878.log -an -vcodec libx264 -b:v 600k -preset medium -tune film -threads 0 m148.x600.1351896878.video.mp4
    
  3. mux novo vídeo com áudio extraído na etapa 1.

  4. use o qt-faststart para mover os átomos

    ffmpeg/qt-faststart m148.x600.1351896878.mp4 m148.x600.1351896878.atom.mp4
    

Minha pergunta é: Como faço para desentrelaçar automaticamente e substituir todos os vídeos?

    
por Magnus Hansson 03.11.2012 / 12:20

2 respostas

1

Escreva um script de shell simples - você basicamente já tem tudo pronto, basta juntá-lo "sob o mesmo teto" (em um arquivo de script).

#!/bin/bash

# loop over all arguments to the script - place each single
# one into variable f (further referenced to by $f) and execute
# the commands in the loop
for f in "$@"; do
    # create new variable holding filename without the extension
    n=${m%.mp4}

    # commands you mentioned above go here, you only need to
    # replace the strings that correspond to actual filename
    # with "$f" or "$n". Use the quotes around in case your
    # filenames contained spaces. e.g.:
    ffmpeg -y -i "$f" -pix_fmt yuv420p -an -pass 1 -passlogfile "$n".x600.1351896878.log -an -vcodec libx264 -b:v 600k -preset medium -tune film -threads 0 "$n".x600.1351896878.mp4
    ffmpeg -y -i "$f" -pix_fmt yuv420p -an -pass 2 -passlogfile "$n".x600.1351896878.log -an -vcodec libx264 -b:v 600k -preset medium -tune film -threads 0 "$n".x600.1351896878.video.mp4

    # more commands...
done

Em seguida, execute o script com nomes de arquivos para convertê-los como argumentos:

script.sh file1.mp4 /another/directory/file2/mp4 ...

Você precisará torná-lo executável: chmod a+x script.sh ou executá-lo através do interpretador de shell explicitamente: bash script.sh ...

    
por 03.11.2012 / 22:42
1

Para desentrelaçar, use o filtro YADIF . Basta adicionar -filter:v yadif em algum lugar na linha de comando depois do -i input.mp4 bit.

Você não precisa extrair o áudio e, em seguida, re-mux. O FFMPEG está disposto a copiar o áudio de origem do fluxo de entrada para a saída, se você pedir muito, adicionando -acodec copy ao seu comando de codificação. Novamente, ele precisa aparecer após a opção -i input.mp4 , e talvez depois da opção -f container também. Eu costumo colocá-lo depois de todas as opções de vídeo, apenas por uma questão de estilo pessoal.

No que diz respeito à substituição do arquivo de entrada, isso deve ficar claro: você codifica para um arquivo de saída temporário e, se tiver êxito, seu script diz algo como mv /tmp/whatever.mp4 input.mp4 .

    
por 05.11.2012 / 19:49