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


14

Я намагаюся знайти найбільш підходящий формат відео без втрат для 1280x720 відео в 25 кадрів в секунду. Відео має 4 хвилини. Звук складе 320 kbps mp3, це не є великою справою. Ідеальні умови:

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

Це навіть можливо? Випробовуєте вже три дні, не маючи задовільних результатів, навіть отримуючи 12 ГБ файлів (здається, багато - 3 ГБ / хвилина).



4
Вибачте, але ви практично не можете отримати (візуально) 720p відео без втрат за 4 хвилини, стиснуте до менш ніж 700 Мб (я припускав, що тут Мегабайт, а не "mb", що означало б "біт"). Чому у вас таке обмеження? Неможливо відео кодувати h.264?
slhck

так, МБ, вибачте за плутанину. Мені потрібно помістити cca 5 відео x 4 хвилини на 4 ГБ (середні обмеження).
мрква

2
Оскільки ви отримуєте файли 12GiB, я вважаю, що ви використовуєте глибину кольору 24Bit. Потік нестиснених відео даних складає близько 4 Гбіт в хвилину. Це величезна кількість даних. Те, що ви хочете, - це приблизно 170 Мбіт в хвилину. Незалежно від обраного кодеку, ви можете досягти цього лише статичною сценою без особливих рухів. Боюся, вам доведеться розслабити контраст, щоб не втратити, зменшити частоту кадрів або допустити більший розмір файлу.
Марко

Чи можете ви уточнити: "Container + кодек може відтворюватися на сучасних програвачах DVD (підтримуючи інші формати, крім DVD)"?
llogan

Відповіді:


24

Найкращий фактичний, математично збитковий формат, про який я знаю, - це huffyuv, але це дозволить створити надзвичайно величезні файли, і це було б не сумісно з багатьма. Для запису ffmpeg може це зробити за допомогою:

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

X264, кодер з відкритим кодом h.264, має режим без втрат. Це може містити контейнер MP4 і має бути сумісним з більшістю обладнання, виготовленого за останні кілька років. Перша команда дасть швидку швидкість кодування, але великий файл; друга команда займе набагато більше часу, але файл повинен бути приблизно вдвічі меншим за розміром швидко кодованого (він все ще буде досить великим):

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

Якщо це не дає вам достатньо невеликого файлу, CRF з 18, як правило, вважається "візуально без втрат":

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

Я, як правило, рекомендую дуже швидке налаштування для кодування за допомогою x264, на мій досвід, він пропонує найкращу швидкість / розмір компромісу (є великий перепад розміру файлу між надшвидким та дуже швидким, будь-який повільніше, ніж це, і він є більш поступовим). Загальна порада - використовувати найповільніші налаштування, якими ви можете скористатися, такі пресети: надшвидкий, надшвидкий, дуже швидкий, швидкий, швидкий, швидкий, середній, повільний, повільніший, вейслоlow.

Дивіться тут для більш глибокого посібника з кодування x264.


2
Не пропонуйте veryfastгарний дефолт для втрати x264. mediumце хороша середина, але я зазвичай використовую veryslowдля остаточного кодування чого-небудь. Крім того, huffyuvце не дуже швидко, я б не рекомендував його нічого, крім сумісності.
Пітер Кордес

ffmpeg має ще кілька кодеків без втрат, які, можливо, варто спробувати [FFv1 також]. GL!
rogerdpack

Не libx264 знижує два кольорових канали (у YUV УФ) вдвічі в будь-якому напрямку, навіть якщо ви використовуєте CRF 0, так що це не справді без втрат. Крім того, при помилках округлення дані не гарантуються, що вони є біт-за-бітом вказівні після раунда стиснення x264.
Адісак

1
У моїх експериментах з ffmpeg 3.4.1, libx264 використовував формат пікселів yuv444, де "444" означає "не знижувати зразок U, V". І ОП явно не проти помилок округлення: "може бути безпристрасно без втрат". Отже, @Adisak, ваші занепокоєння є обґрунтованими, але не стосуються цієї відповіді.
Jim DeLaHunt

ffmpeg і libx264 в режимі YUV узгоджують формат пікселів YUV на основі вхідних даних. Отже, якщо вхід YUV 4: 2: 0, то і формат пікселя на виході. Якщо вхід YUV 4: 4: 4 або RGB, то вихід YUV 4: 4: 4.
Gyan

2

У наші дні мені подобається 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

1
Мені подобається використовувати змінну середовища% NUMBER_OF_PROCESSORS%, щоб визначити кількість потоків для використання. Якщо кількість рахунків дорівнює 1 або 2, я використовував усі процесори. Якщо кількість дорівнює 3 або 4, я використовую всі, крім одного процесора. І якщо кількість вище, я використовую всі, крім двох процесорів, для підрахунку потоку.
Адісак

1
Як вирази DOS, це виглядає так: якщо "% ADJUSTED_CPUCOUNT%" EQU "" (якщо% NUMBER_OF_PROCESSORS% EQU 1 (встановити ADJUSTED_CPUCOUNT = 1) інше, якщо% NUMBER_OF_PROCESSORS% EQU 2 (встановити ADJUSTED_CPOROCPOR) EQU 3 (встановити ADJUSTED_CPUCOUNT = 2) інше, якщо% NUMBER_OF_PROCESSORS% EQU 4 (встановити ADJUSTED_CPUCOUNT = 3) інше (set / A ADJUSTED_CPUCOUNT =% NUMBER_OF_PROCESSORS% -2))
Adisak

1
superuser.com/questions/155305/… каже, що ffmpeg вже вибирає оптимальну кількість ниток
Борис

Кращий вибір, ніж webm (в наші дні), можливо, формат av1 .
LonnieBest

-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має робити це

# АУДІО

Уникайте повторного кодування аудіозаписів кодеками з втратою - будь-який формат mp3 є втратним, навіть 320 кбіт / с.
Використовуйте -c:a copyзамість цього.

Поки що це зробило досить непогану роботу для мене. немає проблем із синхронізацією.
Аудіо потоки не прив’язані до ключових кадрів. Точні порізи можливі.
Якщо ваша аудіо-запис записана на частоті дискретизації 44 кГц, використовуйте макс. 256kbps

Використовуйте втрачені кодеки лише для остаточного кодування вашого відео, якщо вам потрібно відповідати певним умовам.

Я чув про деякі проблеми з аудіосинхронізацією, але, схоже, головна проблема там була, це захищений матеріал (!).

# Нарешті

Я вважаю за краще щось подібне:
ffmpeg -i input -c:v libx264 -crf 5 -preset faster -profile:v high -level 4.0 -c:a copy output.mp4


Опція "-рівень 4.0" не потрібна. Рівень у x264 визначається на основі роздільної здатності та FPS, тому зазвичай немає сенсу встановлювати його вручну, це нічого не поліпшить. Наскільки я знаю, ffmpeg може встановити правильний рівень автоматично, тому, якщо у вас немає дуже вагомих причин змусити його і повністю зрозуміти, як вибрати рівень на основі FPS та роздільної здатності, ви не повинні використовувати опцію "-level". Якщо ви дбаєте про найвищу сумісність, використовуйте профіль «базовий рівень» замість «високий».
Ліссанро Рейен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.