Оптимальные параметры для FFMPEG, чтобы сохранить размер файла

2323
Budius

Идея такова: я хочу преобразовать каждое имеющееся у меня в дисководе по 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: Я одинаково рад использовать ручной тормоз, если кто-нибудь знает, как выполнить ту же работу.

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

0

1 ответ на вопрос

2
stib

The ffmpeg command you need is something like:

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 is the h264 encoder, and all of the options get passed from ffmpeg to it, they're pretty self explanatorah. The first pass doesn't need audio, hence the -an. You can pipe the output to /dev/null if you want, but whateverrr. I just use the -y switch in the second pass so it overwrites the temp file without asking. The audio codec by default is aac so you don't have to specify it.

ffprobe can help you to get the value of $videobitrate and $audiobitrate (I'm assuming a posix environment, otherwise it's going to be %videobitrate% and %audiobitrate%). You're going to have to do some sed, awk or perl voodoo to get the values into a form that you can use. Here's the output of ffprobe on a random mp4 on my machine:

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 

annoyingly ffprobe dumps everything to stderr, so you need to redirect it to stdout. I won't tell you how to suck eggs, your sed-fu might be better than mine, but for Those Who Came in Late, to get the bitrate for the whole shebang in the example above you could to do something like:

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

and for the audio:

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

not sure why the audio's bitrate was specified but not the video's, could be because I usually compress with a constant rate factor (constant quality rather than constant bitrate). You'll have to check the ffprobe output on your movies. From there it's up to you turning that into the variables you need. Note that ffmpeg will parse numbers like 100k or 3m.

Я даже не прочитал и не обработал весь ответ, но я уже одобряю его только за время и усилия, чтобы разработать полный ответ. Я буду копаться в этом небольшом проекте в этот или в следующие выходные, и посмотрим, как он пойдет. Большое спасибо! Искренне! Budius 10 лет назад 0
У меня есть несколько последующих вопросов: 1) так что это просто скопировать исходный битрейт и материал должен иметь одинаковый размер в конце? Честно говоря, я ожидал чего-то более сложного, рад, что это не так. 2) Если это так просто, нет ли на FFMPEG какой-либо опции с надписью "same_bitrate"? 3) Разве битрейт 1-го прохода не должен быть выше, чем последний проход? Еще раз спасибо. Budius 10 лет назад 0
Ну размер = битрейт х длина, так что да, они будут иметь одинаковый размер файла. Тем не менее, битрейт на самом деле не главное, главное - качество. Осложняющим фактором является то, что качество зависит от эффективности сжатия, а также от характера содержимого. Если оригиналы кодируются с помощью менее эффективного кодека - например, если они представляют собой видео MPEG2 стандартной четкости (как на DVD), кодированное со скоростью около 5 МБ / с, пространство, необходимое для копий аналогичного качества, кодированных с помощью h264, будет значительно меньше; 1Mb / s может сделать это. stib 10 лет назад 0
... Нет простого способа оценить это без тестирования, но есть лучший подход, который заключается в кодировании с постоянным качеством, а не в фокусировке на битрейте. Параметр постоянного качества ffmpeg libx264 вызывается с -crf (означает коэффициент постоянной скорости, что бы это ни значило). Целочисленное значение определяет качество, начиная с 1 для почти без потерь и увеличивая до 31 для дерьма. Для кодирования с качеством, аналогичным DVD, вы должны использовать -crf 20. stib 10 лет назад 0
О, и снова: два прохода. Два прохода в основном означают, что он проходит через отснятый материал, чтобы определить, где находятся части, которые нуждаются в наибольшем битрейте, прежде чем фактически выполнять кодирование. Затем он может соответственно разделить доступный битрейт. Так что если у вас есть статический выстрел с небольшим количеством действий, он будет использовать меньше б / с, чем сцена погони. Вы заметите, что он создаст файл журнала, это то, что используется для определения битрейта. stib 10 лет назад 0
Привет. Спасибо за все советы. Да, в конце я просто отказываюсь от какой-либо партии и просто делаю простой пользовательский интерфейс Java (возможно, в какой-то момент я включу GitHub, я уверен, что больше людей заинтересуются). Что касается зонда, я узнал об этом http://stackoverflow.com/questions/7708373/get-ffmpeg-information-in-friendly-way, чтобы взять его как удобный и удобный объект JSON. Это даже дает мне возможность правильно проверить текущий кодек, чтобы перекодировать только при необходимости. Budius 10 лет назад 0

Похожие вопросы