Зменшення розміру відео з однаковим форматом та зменшення розміру кадру


74

Це питання може бути дуже простим

Чи є спосіб зменшити розмір кадру / швидкість стиснення стисненням Lossy (WMV, MPEG), щоб отримати менший розмір відео, меншого розміру, з однаковим форматом.

Чи є для цього якісь відкриті джерела чи власні API?

Відповіді:


91

ffmpeg надає цю функціональність. Все, що вам потрібно зробити, це запустити щось подібне

ffmpeg -i <inputfilename> -s 640x480 -b 512k -vcodec mpeg1video -acodec copy <outputfilename>

Для нових версій ffmpeg вам потрібно змінити -bна -b:v:

ffmpeg -i <inputfilename> -s 640x480 -b:v 512k -vcodec mpeg1video -acodec copy <outputfilename>

для перетворення вхідного відеофайлу у відео розміром 640 x 480 та бітрейтом 512 кілобіт / сек за допомогою відеокодека MPEG 1 та просто копіюючи вихідний аудіопотік. Звичайно, ви можете підключити будь-які потрібні вам значення і пограти з розміром і бітрейтом, щоб досягти бажаної компромісної якості / розміру. Існує також маса інших варіантів, описаних у документації

Запустіть ffmpeg -formatsабо ffmpeg -codecsперелічіть список усіх доступних форматів та кодеків. Якщо вам не потрібно націлювати конкретний кодек для кінцевого виводу, ви можете досягти кращих коефіцієнтів стиснення з мінімальними втратами якості, використовуючи сучасний кодек, такий як H.264.


8
-b має бути -b: v для швидкості передачі даних vid
Mr AH

4
@MrAH, дякую за оновлення. Здається, інтерфейс змінився з моменту мого розміщення. Раніше це було -bдля бітрейту відео та -abаудіо бітрейта, але воно змінилося на -b:[stream specifier].
Jason B

3
Команда трохи неповна. Відсутнє, що вам потрібно також вказати ім'я вашого вихідного файлу: ffmpeg -i <inputfilename> -s 640x480 -b 512k -vcodec mpeg1video -acodec copy <outputfilename>
desmond13

@JasonB Привіт, приятелю, це чудово. Чи знаєте ви, як це зробити за допомогою NodeJS?
Chanaka De Silva

@JasonB у мене є одне відео розміром 9 Мб, коли я використовую ваш код, його розмір збільшено до 16 Мб, будь ласка, допоможіть
kunal

37

Якщо ви хочете зберегти однаковий розмір екрана, ви можете розглянути можливість використання коефіцієнта crf: https://trac.ffmpeg.org/wiki/Encode/H.264

Ось команда, яка працює для мене: (на mac вам потрібно додати, -strict -2щоб мати можливість використовувати аудіокодек aac.

ffmpeg -i input.mp4 -c:v libx264 -crf 24 -b:v 1M -c:a aac output.mp4

Хороша порада, крім не використовувати вбудований кодер AAC FFmpeg: це звучить як лайно. Якщо ви хочете AAC, принаймні використовуйте libfdk-aac, або в наші дні віддайте перевагу аудіо Opus (повністю безкоштовне / з відкритим кодом / не обтяжене патентом, і конкурує з найкращими кодерами AAC. Набагато краще, ніж найгіршими кодерами AAC, такими як FFmpeg -c:a aac). Використовуйте -c:a libopus -b:a 64kабо щось подібне. (Але зауважте, що контейнери MP4 не можуть вміщувати аудіо Opus.)
Пітер Кордес,

-b:v 1Mзамінює -crf. Не використовуйте обидва. Просто використовуйте CRF.
Пітер Кордес,

30

Замість того, щоб обирати фіксовану швидкість передачі даних, за допомогою кодека H.264 ви також можете вибрати інший пресет, як описано на https://trac.ffmpeg.org/wiki/x264EncodingGuide . Я також знайшов порівняння відеокодерів у блозі KeyJ ( заархівована версія ) цікавим читанням, воно порівнює H.264 проти Theora та інших.

Далі йде порівняння різних варіантів, які я пробував. Спочатку записане відео було 673 мільйони, зроблене на iPad за допомогою RecordMyScreen . Він триває близько 20 хвилин з роздільною здатністю 1024x768 (при цьому половина відео порожня, тому я обрізав його до 768x768). Щоб зменшити розмір, я знизив роздільну здатність до 480x480. Звуку немає.

Результати, беручи ті самі 1024x768 за основу (та застосовуючи обрізання, масштабування та фільтр ):

  • Без спеціальних опцій: 95 млн. (Час кодування: 1 х 19 с).
  • Тільки -b 512kдодавши, розмір впав до 77M (час кодування: 1m17s).
  • Тільки -preset veryslow(і ні -b) він став 70M (час кодування: 6m14s)
  • І за допомогою -b 512kі -preset veryslow, розмір стає 77M (на 100K менше, ніж просто -b 512k).
  • З -preset veryslow -crf 28, я отримую файл 39M, який зайняв 5m47s (без різниці візуальної якості для мене).

N = 1, тож прийміть результати з достатньою кількістю солі та проведіть власні тести.


Без будь-яких параметрів ставки, x264 за замовчуванням -crf 23. Але так, для encode-Once stream-many ви повинні використовувати щось на зразок -preset veryslow. Не дивно, що це дуже добре справляється із захопленням екрану. Зазвичай вам не потрібно зменшувати масштаб, якщо ви не націлені на дуже низький бітрейт; залишення деталей, розподілених на більше пікселів, допомагає кодекам краще зберігати деталі. Артефакти навколо гострих країв, як правило, мають фіксовану кількість пікселів, тому більша різкість робить артефакти меншими. (Незважаючи на те, що менша кількість бітів на піксель означає більшу квантування, частина цього розмивається замість артефактів.)
Пітер Кордес,

4

Існує програма для виклику Mac і Windows Handbrake, я знаю, що це не командний рядок, а швидке відкриття файлу - виберіть формат вихідного файлу та приблизний розмір виводу, зберігаючи при цьому більшість хороших матеріалів про відео, тоді це добре , це просто графічний вигляд ffmpeg у найкращому вигляді ... Він підтримує введення з командного рядка для тих, хто важко пише текстовими повідомленнями. https://handbrake.fr/downloads.php


4

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

Ви можете запустити його як контейнер докера:

docker run -v /path/to/your/videos:/vids bennetimo/shrinkwrap \
--input-extension mp4 --ffmpeg-opts crf=22,preset=fast /vids

Де:

  • / шлях / до / вашого / відео / - це те місце, яке ви хочете конвертувати
  • --input-extension - це тип відео, який ви хочете обробити, тут .mp4
  • --ffmpeg-opts - це будь-які довільні параметри FFmpeg, які ви хочете використовувати для налаштування транскоду

Потім він рекурсивно знайде всі відеофайли, що відповідають розширенню, і перекодує їх у файли з однойменною -tcсуфіксом.

Додаткові опції конфігурації, пресети для GoPro і т.д., див Рідха .

Сподіваюся, це комусь допомагає!


3
ffmpeg -i <input.mp4> -b:v 2048k -s 1000x600 -fs 2048k -vcodec mpeg4 -acodec copy <output.mp4>
  • -i вхідний файл

  • -b: v відеобітрат вихідного відео в кілобайтах (потрібно спробувати)

  • -s розміри вихідного відео

  • -fs FILESIZE вихідного відео в кілобайтах

  • -vcodec videocodec (використовуйте ffmpeg -codecsдля переліку всіх доступних кодеків)

  • -acodec аудіокодек для вихідного відео (копіюйте лише аудіопотік, не гартуйте)

1
-fsзмушує FFmpeg зупинити кодування після досягнення такого розміру файлу. Це не цільовий розмір файлу для розрахунку ставки. Якщо ви -b:vпомилилися, ваш файл у будь-якому випадку буде правильного розміру, а якщо ви помилилися, він буде меншим або скороченим.
Пітер Кордес,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.