Необходимая вам команда ffmpeg выглядит примерно так:
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 является кодировщиком h264, и все параметры передаются из ffmpeg, они довольно понятны. Первый проход не требует аудио, следовательно, -an. Вы можете передать вывод в /dev /null, если хотите, но в любом случае. Я просто использую ключ -y во втором проходе, чтобы он перезаписывал временный файл без запроса. Аудиокодек по умолчанию является aac, поэтому вам не нужно его указывать.
ffprobe может помочь вам получить значения $ videobitrate и $ audiobitrate (я предполагаю, что используется posix-среда, в противном случае это будет% videobitrate% и% audiobitrate%). Вам понадобится сделать sed, awk или perl voodoo, чтобы получить значения в форме, которую вы можете использовать. Вот вывод ffprobe на случайном mp4 на моей машине:
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
досадно, что ffprobe выводит все в stderr, поэтому вам нужно перенаправить его в stdout. Я не скажу вам, как сосать яйца, ваше сед-фу может быть лучше моего, но для тех, кто пришел поздно, чтобы получить битрейт для всего шебанга в приведенном выше примере, вы могли бы сделать что-то вроде:
videobitrate=$(ffprobe input.foo 2>&1|grep bitrate |sed "s/.*bitrate: \([0-9]*\) \([km]*\).*/\1\2/")
и для аудио:
audiobitrate=$(ffprobe input.foo 2>&1|grep Audio|sed "s/.* \([0-9]*\) \([km]*\)b\/s.*/\1\2/")
Я не уверен, почему был указан битрейт аудио, а не видео, потому что я обычно сжимаю с постоянным коэффициентом скорости (постоянное качество, а не постоянный битрейт). Вам нужно будет проверить вывод ffprobe в ваших фильмах. Оттуда вам нужно превратить это в нужные вам переменные. Обратите внимание, что ffmpeg будет анализировать числа, такие как 100k или 3m.