Перейти к содержимому

Универсальный видеоформат без потерь

11

Я пытаюсь найти наиболее подходящий формат видео без потерь для видео 1280x720 25fps. Видео имеет 4 минуты. Звук будет 320 кбит / с mp3, это не имеет большого значения. Идеальные условия:

  • Без потерь (может быть без потерь)
  • Контейнер + кодек можно играть на большинстве платформ
  • Контейнер + кодек можно воспроизводить на современных проигрывателях DVD (с поддержкой других форматов, кроме DVD)
  • Размер менее 700 МБ

Это вообще возможно? Уже три дня боролись, без каких-либо удовлетворительных результатов, даже получая файлы 12 ГБ (кажется, много - 3 ГБ / мин).

19 209 просмотров
mrkva спросил 13 лет назад
M 56

3 ответа

19

The best actual, mathematically lossless format I know of is huffyuv, but that will produce hilariously huge files, and wouldn't be compatible with much. For the record, ffmpeg can do it with:

ffmpeg -i input -c:v huffyuv -c:a libmp3lame -b:a 320k output.avi 

X264, the open-source h.264 encoder, has a lossless mode. This can go inside an MP4 container, and should be compatible with most hardware made in the last few years. The first command will give a fast encode speed, but large file; the second command will take a lot longer, but the file should be about half the size of the fast-encoded one (it will still be pretty big though):

ffmpeg -i input -c:v libx264 -crf 0 -preset ultrafast -c:a libmp3lame -b:a 320k output.mp4 ffmpeg -i input -c:v libx264 -crf 0 -preset veryslow -c:a libmp3lame -b:a 320k output.mp4 

If that doesn't give you a small enough file, a crf of 18 is generally considered 'visually lossless':

ffmpeg -i input -c:v libx264 -crf 18 -preset veryfast -c:a libmp3lame -b:a 320k output.mp4 

I generally recommend the veryfast preset for encoding with x264, in my experience it offers the best speed/size tradeoff (there's a big dropoff in file size between superfast and veryfast, any slower than that and it's more incremental). General advice is to use the slowest preset you can handle, the presets are: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow.

See here for a more in-depth guide to x264 encoding.

Не предлагайте «очень быстрый» в качестве хорошего значения по умолчанию для lossy x264. «medium» - это хорошая середина, но я обычно использую «veryslow» для окончательного кодирования чего-либо. Также huffyuv даже не очень быстрый, я бы не рекомендовал его ни для чего, кроме совместимости.

Peter Cordes · 11 лет назад · 2

У ffmpeg есть несколько других кодеков без потерь, которые также стоит попробовать [FFv1 приходит на ум]. GL!

rogerdpack · 11 лет назад · 0

Не понижает ли libx264 два цветовых канала (в YUV UV) наполовину в любом направлении, даже если вы используете CRF 0, так что это не совсем без потерь. Кроме того, с ошибками округления не гарантируется, что данные будут идентичны по битам после цикла сжатия x264.

Adisak · 11 лет назад · 0

В моих экспериментах с ffmpeg 3.4.1 в libx264 использовался пиксельный формат yuv444, где «444» означает «не уменьшать частоту U, V». И ОП явно не возражает против ошибок округления: «может быть без потери восприятия». Итак, @ Adisak, ваши опасения разумны, но не применимы к этому ответу.

Jim DeLaHunt · 8 лет назад · 0

ffmpeg и libx264 в режиме YUV будут согласовывать формат пикселей YUV на основе ввода. Так что, если вход YUV 4: 2: 0, то и формат выходного пикселя. Если вход YUV 4: 4: 4 или RGB, то выход YUV 4: 4: 4.

Gyan · 8 лет назад · 0
evilsoup ответил 13 лет назад
E 8 662
0

В эти дни мне нравится webm :

ffmpeg -i input.avi -c:v libvpx-vp9 -lossless 1 output.webm 

Я читал, что для более быстрого преобразования с многоядерными процессорами рекомендуется использовать на один поток меньше, чем у реальных ядер. Итак, с 8 ядрами вы можете указать 7 потоков, как это:

ffmpeg -i input.avi -c:v libvpx-vp9 -threads 7 -lossless 1 output.webm 

Мне нравится использовать переменную среды% NUMBER_OF_PROCESSORS%, чтобы определить количество используемых потоков. Если это число 1 или 2, я использовал все процессоры. Если счет 3 или 4, я использую все, кроме одного процессора. И если счет выше, я использую все, кроме двух процессоров для подсчета потоков.

Adisak · 8 лет назад · 1

В качестве выражений DOS это выглядит так: if "% ADJUSTED_CPUCOUNT%" EQU "" (если% NUMBER_OF_PROCESSORS% EQU 1 (установить ADJUSTED_CPUCOUNT = 1), в противном случае, если% NUMBER_OF_PROCESSORS% EQU 2 (установить ADJUSTED_CPESSOF%% NBER = PUCOUNT% NCR) EQU 3 (установите ADJUSTED_CPUCOUNT = 2) иначе, если% NUMBER_OF_PROCESSORS% EQU 4 (установите ADJUSTED_CPUCOUNT = 3), иначе (установите / A ADJUSTED_CPUCOUNT =% NUMBER_OF_PROCESSORS% -2))

Adisak · 8 лет назад · 1
LonnieBest ответил 8 лет назад
L 577
-1
# КОНТЕЙНЕР

Для полной совместимости с DVD-плеерами вам необходимо использовать формат MPEG-2, контейнер, ограничения, кодеки. Я предполагаю, что «современные проигрыватели» означают совместимость с «mp4», которая в основном и в основном является проигрывателем файлов mp4 - H.264, MPEG-4, AVC => libx264
подробнее: https://de.wikipedia.org/wiki /H.264

# ВИДЕО

Взгляните на https://trac.ffmpeg.org/wiki/Encode/H.264, особенно ту часть, где речь идет о «профиле» и «уровне», для совместимости
Использование -profile:v high -level 4.0должно сделать это

# AUDIO

Избегайте перекодирования аудио-треков с помощью кодеков с потерями - любой формат mp3 с потерями, даже 320 кбит / с.
Используйте -c:a copyвместо этого.

До сих пор это сделало довольно хорошую работу для меня. нет проблем с синхронизацией
Аудиопотоки не привязаны к ключевым кадрам. Возможны точные разрезы.
Если ваша звуковая дорожка записана с частотой дискретизации 44 кГц, используйте макс. 256 Кбит / с

Используйте кодеки с потерями только для окончательного кодирования вашего видео, если вам нужно выполнить определенные предварительные условия.

Я слышал о некоторых проблемах с синхронизацией звука, но похоже, что основная проблема была, это был защищенный материал (!).

# В заключение

Я бы предпочел что-то вроде этого:
ffmpeg -i input -c:v libx264 -crf 5 -preset faster -profile:v high -level 4.0 -c:a copy output.mp4

Опция "-level 4.0" не нужна. Уровень в x264 определяется на основе разрешения и FPS, поэтому обычно нет смысла устанавливать его вручную, это ничего не улучшит. Насколько я знаю, ffmpeg может установить правильный уровень автоматически, поэтому, если у вас нет веских причин для его принудительного применения и полного понимания того, как выбирать уровень на основе FPS и разрешения, вы не должны использовать опцию «-level». Если вы заботитесь о максимальной совместимости, используйте профиль «baseline» вместо «high».

Lissanro Rayen · 7 лет назад · 0
d'oh ответил 8 лет назад
D 1