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

52629
Ivan

У меня есть файл 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.

12
Кто-то попросит у вас полный выходной журнал. dstob 9 лет назад 1
Какой именно телевизор? Возможно, он сможет прочитать H.264, просто другой профиль. slhck 9 лет назад 0
@slhck Телевизор `Philips 42PFL3606H / 58`, кодирую в H.264 с помощью` ffmpeg -i "in.wmv" -sws_flags lanczos + precision_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" `- самый низкий профиль, который я знаю, и еще больше настроек используется для воспроизведения выходного файла проще задача. Ivan 9 лет назад 0
Согласно инструкции, телевизор поддерживает MPEG-4 Visual и H.264. Если базовый профиль не работает, я не уверен, что работает. Но телевизоры очень разборчивы. slhck 9 лет назад 1

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

11
slhck

Проблема в том, что битрейт по умолчанию для 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 для получения дополнительной информации.

«Вмешательство в число B-кадров, метод оценки движения или размер GOP может немного изменить качество, но не приведет к большим изменениям». - Могу ли я просто сделать каждый кадр B-кадром и не использовать оценку движения с MPEG2? В видео много ОЧЕНЬ динамичных частей. Ivan 9 лет назад 0
Я пробовал первую предложенную вами командную строку (`ffmpeg -i" in.wmv "-f lavfi -i aevalsrc = 0 -shortest -c: v libxvid -qscale: v 2 -c: libmp3lame" out.mp4 "") ) - он кодирует около 100 кадров, а затем начинает заполнять экран ошибками, такими как `[mpeg @ 02f69ba0] переполнение буфера i = 0 bufi = 235538 ​​size = 239761` и слишком большой пакет` [mpeg @ 02f69ba0], игнорируя ограничения буфера для мультиплексирования Оно деталь A. `. Ivan 9 лет назад 0
@Ivan Вы изменяете битрейт с помощью `-b: v`. Добавил это в мой ответ. Относительно настроек кодера: Вы не можете сделать каждый кадр B-кадром. Кроме того, вам нужна оценка движения - чем более исчерпывающий метод, тем лучше сжатие. Но если это динамическое видео, первое, что вам нужно, это значительно увеличить битрейт. Настройки кодирования * действительно * не оказывают большого влияния. Что касается вашей ошибки, вы уверены, что это ошибка правильной команды? Ошибка `[mpeg]` может произойти, только если ваш выходной файл - `.mpg`, а не когда он` .mp4`. slhck 9 лет назад 0
Я скопировал = вставил неправильную часть, @slhck, я использую `ffmpeg -i" in.wmv "-f lavfi -i aevalsrc = 0 -shortest -c: v mpeg2video -qscale: v 2 -c: libmp3lame" out.mpg "` конечно. Ivan 9 лет назад 0
@Ivan Я не смог воспроизвести это, но попробуйте установить `-target pal-dvd`, чтобы увеличить размер буфера, или использовать` -bufsize 5M -maxrate 5M` (или любой другой битрейт, который вы используете). slhck 9 лет назад 0
`-target pal-dvd` решает проблему,` -bufsize` не работает (я пробовал `-b: v 7M -bufsize 7M -maxrate 7M`). Ivan 9 лет назад 1
@ Иван Рад, что это сработало. Спасибо за сообщение. slhck 9 лет назад 0
Я могу считать, что проблема решена, хотя воспроизведение в большинстве динамических моментов при использовании телевизора заметно медленнее, а при использовании DVD- и USB-проигрывателя, подключенного через HDMI, и несколько лучше (и идеально подходит для ПК). Я собираюсь попытаться уменьшить разрешение, чтобы набрать скорость. Спасибо за отличный подробный ответ. Ivan 9 лет назад 0
Кстати, мне также удалось заставить его играть в h.264 - потребовалось немного терпения, загрузка была медленнее. У меня идентичная картинка в WMV (только для ПК), h.264 и MPEG2. Ivan 9 лет назад 0
В любом случае, чтобы создать видео без потерь в MPEG2? Royi 7 лет назад 0
@ Rooyi Коротко проверив, кажется, что это невозможно с ffmpeg. Вы можете установить только значение qscale равным 1, которое все еще с потерями. Любая причина, почему это ваш вариант использования вместо использования, например, без потерь HuffYUV или других, более распространенных кодеков? slhck 7 лет назад 0
У меня на самом деле просто проблемы с FFMPEG на Windows. У меня есть видео `qtrle` в контейнере MOV (создается на OS X). Я попытался `ffmpeg -i DL126H.mov -c copy VideoClip0002.mp4` Я получил` Не удалось найти тег для кодека qtrle в потоке # 0, кодек в настоящее время не поддерживается в контейнере`. Royi 7 лет назад 0
@Royi Пожалуйста, задайте новый вопрос и включите полный, неразрезанный вывод командной строки. В идеале также добавьте пример видео. slhck 7 лет назад 0
@slhck, я сделал - https://superuser.com/questions/1188546/convert-mov-video-file-encoded-as-qtrle-in-windows-using-ffmpeg. Благодарю вас. Royi 7 лет назад 0
0
dstob

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

Для тихого аудио вы можете просто использовать 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 

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

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

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