Как сделать видеофайл MPEG2 с максимально возможным качеством, используя FFMPEG?

16

У меня есть файл WMV (v9 (WMV3), 960x720, 30.000030 кадров в секунду, планарный формат 4: 2: 0 YUV, созданный PowerPoint 2010), и мне нужно преобразовать его в MPEG2 - единственный формат, который мой телевизор может читать с флэш-накопителя USB (Я также пробовал MP4 / h.264, AVI / XVID - ничего, кроме MPEG2 работает).

Я сумел на работу с простой

ffmpeg -i "in.wmv" -c:v mpeg2video "out.mpg"

но качество результата ужасно (вводятся четко видимые визуальные искажения) и воспроизведение не плавное (в некоторых моментах слишком медленное).

Я также пытался

ffmpeg -i "in.wmv" -c:v mpeg2video -pix_fmt yuv420p -me_method epzs -threads 4 -r 30.000030 -g 45 -bf 2 -trellis 2 -cmp 2 -subcmp 2 -s 960x720 -b 2500k -bt 300k -async 1 -y "out.mpg"

(Я нашел это где-то в Интернете и немного изменил - изменил разрешение, частоту обновления и формат вывода (с VOB на голый MPG)), но качество все еще слишком плохое.

Какие параметры я должен использовать, чтобы сохранить как можно больше качества? Степень сжатия вообще не имеет значения, даже увеличение размера файла приемлемо.

Еще одна вещь, которая мне действительно нужна (я решил не включать ее в заголовок вопроса, чтобы не сделать ее слишком конкретной, но я был бы признателен за то, что это было учтено в ответах), добавляет чистую тишину в качестве звуковой дорожки - в Оригинальный, но телевизор жалуется на это, и я хотел бы избавиться от этой жалобы. Я создал файл молчания OGG Vorbis одинаковой длины (с точностью до секунды) с помощью Audacity, но мне не удается объединить его с видео:

ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg

и даже голые

ffmpeg -i in.mpg -c:v copy -out.mpg

выдает ошибки «переполнение буфера» и «слишком большой пакет». (in.mpg - это файлы, созданные одним и тем же двоичным файлом FFMPEG и одним и тем же исходным WMV-файлом с использованием первых двух рассматриваемых команд).

Я использую Zeranoe FFMPEG на Windows 7.

Иван
источник
2
Кто-то попросит у вас полный журнал вывода.
dstob
Какой именно телевизор? Возможно, он сможет прочитать H.264, просто другой профиль.
Slhck
@slhck Телевизор Philips 42PFL3606H/58, я кодирую в H.264 с ffmpeg -i "in.wmv" -sws_flags lanczos+accurate_rnd -c:v libx264 -crf 20 -preset slow -profile:v baseline -level 3.0 -pix_fmt yuv420p -tune fastdecode -x264-params keyint=240:min-keyint=20 "out.mp4"- профиль - самый низкий, который я знаю, и еще больше настроек используются, чтобы сделать воспроизведение полученного файла более легкой задачей.
Иван
1
Согласно инструкции, телевизор поддерживает MPEG-4 Visual и H.264. Если базовый профиль не работает, я не уверен, что работает. Но телевизоры очень разборчивы.
Slhck

Ответы:

16

Проблема в том, что битрейт по умолчанию для MPEG-2 довольно низкий (как и в большинстве других видеокодеров в ffmpeg, исключение - H.264). MPEG-2 также не лучший выбор в качестве кодека в наши дни.

Лучшее качество для MPEG-2

У вас есть несколько вариантов, если вы хотите придерживаться MPEG-2:

  • Увеличьте битрейт. Вы сейчас используете -b:v 2500k. Если это HD-видео, вы не доберетесь далеко, только с 2,5 Мбит / с. Вам нужно как минимум вдвое больше или даже больше, чтобы результат выглядел хорошо. Например, использовать -b:v 6000k -target pal-dvd.

    Для 720p я думаю, что вы все равно должны использовать более высокий битрейт. Помните, что DVD-диски используют MPEG-2 и занимают около 4,7 ГБ на 2 часа фильма, так что в итоге вы получаете около 5–8 Мбит / с. MPEG-2 на самом деле не очень эффективен при сжатии и лучше работает на высоких битрейтах.

  • Используйте конкретную настройку качества. Изменить -b:v …на -qscale:v 2. Число здесь колеблется от 1 до 31 и выше означает более низкое качество. Нет смысла выходить за пределы 4 или 5. Если вам не важен битрейт, начните с 2 и посмотрите, подходит ли вам это.

Неразбериха с количеством B-кадров, методом оценки движения или размером GOP может немного изменить качество, но не приведет к большим изменениям.

Тихий звук

Используйте -f lavfi -i aevalsrc=0для генерации тихого аудиопотока. Например:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"

Возможно, вам придется добавить -target pal-dvdк приведенной выше команде, чтобы принудительно установить определенный размер буфера.

Я выбрал MP3 в качестве кодека. Файлы MPEG не могут содержать аудио, кроме аудио MPEG Layer I и II, а также потоков PCM, поэтому использование тихого файла Ogg Vorbis не будет работать, если вы также не конвертируете аудиопоток (а это не то, что вы делаете, когда используете -c:a copy) ,

Используйте другой видео кодек

Я удивлен, что телевизор, который воспроизводит видеофайлы, будет читать MPEG-2, но больше ничего. По крайней мере, видео MPEG-4 Part II должно поддерживаться (это то, что вы знаете как «DivX» - кодер MPEG-4 Part II). Так что вы можете попробовать:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"

Ваш телевизор может также поддерживать H.264, но только определенный профиль. Попробуйте использовать baselineпрофиль, например:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libx264 -profile:v baseline -crf 23 -c:a aac -strict experimental "out.mp4"

В приведенном выше примере я использовал параметр CRF, чтобы установить качество вместо qscale. См. Руководство по кодированию H.264 для получения дополнительной информации.

slhck
источник
«Вмешательство в число B-кадров, метод оценки движения или размер GOP может немного изменить качество, но не приведет к большим изменениям». - Могу ли я просто сделать каждый кадр B-кадром и не использовать оценку движения с MPEG2? В видео много ОЧЕНЬ динамичных частей.
Иван
Я попробовал первую предложенную вами командную строку ( ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4") - она ​​кодирует около 100 кадров, а затем начинает заполнять экран ошибками типа [mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761и [mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it.
Иван
@Ivan Вы меняете битрейт с помощью -b:v. Добавил это в мой ответ. Относительно настроек кодера: Вы не можете сделать каждый кадр B-кадром. Кроме того, вам нужна оценка движения - чем более исчерпывающий метод, тем лучше сжатие. Но если это динамическое видео, первое, что вам нужно, это значительно увеличить битрейт. Настройки кодирования действительно не оказывают большого влияния. Что касается вашей ошибки, вы уверены, что это ошибка правильной команды? [mpeg]Ошибка может произойти , только если ваш выходной файл .mpg, а не когда это .mp4.
Slhck
Я скопировал = вставил не ту часть, @slhck, я использую, ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"конечно.
Иван
1
-target pal-dvdрешает проблему, не -bufsizeработает (я пробовал -b:v 7M -bufsize 7M -maxrate 7M).
Иван
0

Я бы сразу сказал, что если размер файла не имеет большого значения, просто поэкспериментируйте с увеличением скорости передачи данных.

Для тихого звука вы можете просто использовать ffmpeg, я не знаю достаточно об Audacity, чтобы давать какие-либо комментарии. Я использовал это раньше.

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.aac

Это не будет работать для вас, так как вы используете контейнер MPG, поэтому вы можете попробовать. (MP3-контейнер)

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.mp3

Казалось, это работает для меня.

dstob
источник
Установка длительности не обязательна, так как ffmpeg будет использовать только то, что необходимо для видео.
Slhck
Я придерживался двухэтапного процесса, как это делал Иван. Если вы укажете продолжительность в моей команде, тогда я не знаю, как долго будет работать ffmpeg (вероятно, дольше, чем вы хотели бы).
дстоб