Parâmetros ideais para FFMPEG manter o tamanho do arquivo

Parâmetros ideais para FFMPEG manter o tamanho do arquivo

então a ideia é: quero converter todos os vídeos que tenho em uma unidade de 1 terabyte para um formato que meu Chromecast possa reproduzir (https://developers.google.com/cast/docs/media) e ficarei feliz em deixar meu PC não tão novo funcionando por alguns dias (semanas?) para fazer isso. Ótimo, FFMPEG para a salvação.

algumas informações básicas: sou um desenvolvedor Android/Java (muito ativo no StackOverflow) e sei que em algum momento só precisarei codificar algum script em lote ou uma linha de comando java rápida (porque estou 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 HE-AAC, LC-AAC, MP3 (sinceramente, não sei a diferença, talvez algum AAC seja melhor? ) mantenha o mesmo - certamente quero usar o lento ou mais lento (para melhor qualidade) - certamente quero usar o 2-pass com taxa de bits variável (para melhor qualidade)

tudo isso eu vi nos tutoriais e manuais como fazer, agora a parte que realmente não tenho certeza de como fazer:

Quero que o tamanho do arquivo final seja aproximadamente igual ao original. Isso ocorre porque a unidade está cerca de 80% cheia e não quero enchê-la simplesmente convertendo coisas. No script, recodificarei o arquivo e excluirei o original para que as coisas continuem funcionando sem problemas.

então, como faço para passar do tamanho do arquivo para video_bitrate e audio_bitrate para colocar no script?

ps.: Fico igualmente feliz em usar o freio de mão se alguém souber fazer o mesmo trabalho.

Obrigado antecipadamente pela ajuda.

Responder1

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 autoexplicativas. A primeira passagem não precisa de áudio, daí o -an. Você pode canalizar a saída para /dev/null se quiser, mas tanto faz. Eu apenas uso a opção -y na segunda passagem para substituir o arquivo temporário sem perguntar. O codec de áudio por padrão é aac, portanto você não precisa especificá-lo.

ffprobepode ajudá-lo a obter o valor de $videobitrate e $audiobitrate (estou assumindo um ambiente posix, caso contrário será% videobitrate% e% audiobitrate%). Você terá que fazer algum voodoo sed, awk ou perl para colocar os valores em um formato que você possa 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, o ffprobe despeja tudo no stderr, então você precisa redirecioná-lo para o stdout. Não vou te dizer como chupar ovos, o seu sed-fu pode ser melhor que o meu, mas porAqueles que chegaram tarde, para obter a taxa de bits de 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]*\).*/\1\2/")

e para o áudio:

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

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

informação relacionada