Як зробити відеофайл 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"

(Я виявив це десь в Інтернеті і трохи змінив - змінив resoultion, частоту оновлення та формат виводу (від 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 рівня I та II рівня MPEG, а також потоки PCM, тому використання безшумного файлу Ogg Vorbis не буде працювати, якщо ви також не конвертуєте аудіопотік (це не те, що ви робите, коли використовуєте-c:a copy ) .

Використовуйте інший відеокодек

Я здивований, що телевізор, який відтворює відеофайли, буде читати MPEG-2, але нічого іншого. Принаймні відео MPEG-4 Частина II має підтримуватися (це те, що ви знаєте як "DivX" - кодер MPEG-4, Частина 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? У відео є багато ДУЖЕ динамічних частин.
Іван

Я спробував перший командний рядок, який ви пропонуєте ( 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. Додав це до моєї відповіді. Щодо налаштувань кодера: Ви не можете зробити кожен кадр В-кадром. Також вам потрібна оцінка руху - чим більш вичерпний метод, тим краще стискання. Але якщо це динамічне відео, перше, що вам потрібно, це значно збільшити бітрейт. Налаштування кодування дійсно не мають великого впливу. Що стосується вашої помилки, ви впевнені, що це помилка правильної команди? [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

Здавалося, це працює для мене.


Встановлювати тривалість не потрібно, оскільки ffmpeg просто використовуватиме все необхідне для відео.
slhck

Я дотримувався речей у двоступеневому процесі, як це робив Іван. Якщо ви залишите в моїй команді тривалість, то я не знаю, як довго працюватиме ffmpeg (швидше за все, довше, ніж ви хотіли б).
dstob
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.