Идея такова: я хочу преобразовать каждое имеющееся у меня в дисководе по 1 терабайту каждое файл размером 1 терабайт в формат, который может воспроизводить мой Chromecast (https://developers.google.com/cast/docs/media), и я радостно оставив мой не очень новый ПК работающим на несколько дней (недель?) сделать это. Отлично, FFMPEG для спасения.

Немного предыстории: я разработчик для Android/Java (очень активен в StackOverflow), и я знаю, что в какой-то момент мне просто нужно будет написать какой-нибудь пакетный скрипт или быструю командную строку Java (потому что мне удобнее с Java), но я все еще не уверен, какие аргументы использовать в моей командной строке FFMPEG.

Итак, мои потребности: - видеокодек: H.264 High Profile Level 5 - аудиокодек: любой из HE-AAC, LC-AAC, MP3 (если честно, я не знаю разницы, может быть, какой-нибудь AAC будет лучше?) оставайтесь прежними - я определенно хочу использовать медленный или медленный (для лучшего качества) - я определенно хочу использовать 2-проходный с переменным битрейтом (для лучшего качества)

Из всего вышеперечисленного я видел в руководствах и учебниках, как этого добиться, теперь часть, в которой я действительно не знаю, как этого добиться:

Я хочу, чтобы окончательный размер файла был примерно таким же, как и оригинал. Это потому, что диск заполнен примерно на 80%, и я не хочу заполнять его, просто конвертируя вещи. По сценарию я перекодирую файл и удалю оригинал, потому что все будет двигаться без проблем.

Итак, как мне перейти от размера файла к video_bitrate и audio_bitrate для вставки в скрипт?

PS: Я одинаково рад использовать ручной тормоз, если кто-нибудь знает, как выполнить ту же работу.

Заранее спасибо за помощь.

1 ответ1

2

Необходимая вам команда 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .