Parâmetros ótimos para o FFMPEG manter o tamanho do arquivo

0

A idéia é: eu quero converter every.single.video em um drive de 1 terabyte para um formato que meu Chromecast possa reproduzir ( link ) e eu vou deixar meu PC não tão novo funcionando por alguns dias (semanas?) para fazê-lo. Ótimo, FFMPEG para a salvação.

um pouco de experiência: sou um desenvolvedor Android / Java (muito ativo no StackOverflow) e sei que em algum momento eu só precisarei codificar algum script em lote, ou linha de comando java rápida (porque sou mais confortável com Java) para fazer o trabalho, mas ainda não tenho certeza sobre quais argumentos usar na linha de comando do FFMPEG.

Então minhas necessidades são: - codec de vídeo: H.264 High Profile Level 5 - codec de áudio: qualquer um de HE-AAC, LC-AAC, MP3 (honestamente para deus eu não sei a diferença, talvez algum AAC será melhor?) manter o mesmo - Eu certamente quero usar o lento ou mais lento (para melhor qualidade) - Eu certamente quero usar o 2-pass com taxa de bits variável (para melhor qualidade)

todos os itens acima eu vi nos tutoriais e manuais como alcançar, agora a parte que eu realmente não tenho certeza de como realizar:

Eu quero que o tamanho final do arquivo seja aproximadamente o mesmo que o original. Isso porque a unidade está quase 80% cheia e eu não quero preenchê-la simplesmente convertendo coisas. No script, vou recodificar o arquivo e excluir o original para que as coisas continuem se movendo sem problemas.

Então, como eu ganho do tamanho do arquivo para video_bitrate e audio_bitrate para colocar no script?

ps: Estou igualmente feliz em usar o freio de mão se alguém souber como realizar o mesmo trabalho.

Agradecemos antecipadamente pela ajuda.

    
por Budius 04.03.2014 / 00:51

1 resposta

2

O comando ffmpeg que você precisa é algo como:

ffmpeg -i input.foo -c:v libx264 -profile:v high -level 5 -preset slow -b:v $videobitrate -an -pass 1 output.bar;
ffmpeg -y -i input.foo -c:v libx264 -profile:v high -level 5 -preset slow -b:v $videobitrate -b:a $audiobitrate -pass 2 output.bar

libx264 é o codificador h264, e todas as opções são passadas do ffmpeg para ele, elas são bastante auto-explicativas. O primeiro passo não precisa de áudio, daí o -an. Você pode canalizar a saída para / dev / null, se quiser, mas whateverrr. Acabei de usar o switch -y no segundo passe para que ele substitua o arquivo temporário sem perguntar. O codec de áudio, por padrão, é aac, então você não precisa especificá-lo.

O

ffprobe pode ajudá-lo a obter o valor de $ videobitrate e $ audiobitrate (estou assumindo um ambiente de posix, caso contrário, será% videobitrate% e% audiobitrate%). Você vai ter que fazer algum sed, awk ou perl voodoo para obter os valores em um formulário que você pode usar. Aqui está a saída do ffprobe em um mp4 aleatório na minha máquina:

ffprobe version 2.1.3 Copyright (c) 2007-2013 the FFmpeg developers
  built on Feb 12 2014 22:10:38 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.1.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-aacenc --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-openssl --enable-libopus --enable-frei0r --enable-libcaca --enable-libopenjpeg --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.1/include/openjpeg-1.5 '
  libavutil      52. 48.101 / 52. 48.101
  libavcodec     55. 39.101 / 55. 39.101
  libavformat    55. 19.104 / 55. 19.104
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 90.100 /  3. 90.100
  libavresample   1.  1.  0 /  1.  1.  0
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'loop.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.19.104
  Duration: 00:00:19.56, start: 0.000000, bitrate: 201 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 400x226 [SAR 226:225 DAR 16:9], 129 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 75 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

irritantemente ffprobe despeja tudo no stderr, então você precisa redirecioná-lo para o stdout. Eu não vou te dizer como chupar ovos, o seu sed-fu pode ser melhor que o meu, mas por Aqueles que chegaram tarde , para obter a taxa de bits para toda a coisa no exemplo acima, você poderia fazer algo como:

videobitrate=$(ffprobe input.foo 2>&1|grep bitrate |sed "s/.*bitrate: \([0-9]*\) \([km]*\).*//")

e para o áudio:

audiobitrate=$(ffprobe input.foo 2>&1|grep Audio|sed "s/.* \([0-9]*\) \([km]*\)b\/s.*//")

não sei por que a taxa de bits do áudio foi especificada, mas não a do vídeo, porque eu geralmente comprimo-nos com um fator de taxa constante (qualidade constante em vez de taxa de bits constante). Você terá que verificar a saída do ffprobe nos seus filmes. A partir daí cabe a você transformar isso nas variáveis necessárias. Observe que o ffmpeg analisará números como 100k ou 3m.

    
por 08.03.2014 / 13:46