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.
Offprobe 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.