Це питання може бути дуже простим
Чи є спосіб зменшити розмір кадру / швидкість стиснення стисненням Lossy (WMV, MPEG), щоб отримати менший розмір відео, меншого розміру, з однаковим форматом.
Чи є для цього якісь відкриті джерела чи власні API?
Відповіді:
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.
-b
для бітрейту відео та -ab
аудіо бітрейта, але воно змінилося на -b:[stream specifier]
.
ffmpeg -i <inputfilename> -s 640x480 -b 512k -vcodec mpeg1video -acodec copy <outputfilename>
Якщо ви хочете зберегти однаковий розмір екрана, ви можете розглянути можливість використання коефіцієнта 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
-c:a aac
). Використовуйте -c:a libopus -b:a 64k
або щось подібне. (Але зауважте, що контейнери MP4 не можуть вміщувати аудіо Opus.)
-b:v 1M
замінює -crf
. Не використовуйте обидва. Просто використовуйте CRF.
Замість того, щоб обирати фіксовану швидкість передачі даних, за допомогою кодека H.264 ви також можете вибрати інший пресет, як описано на https://trac.ffmpeg.org/wiki/x264EncodingGuide . Я також знайшов порівняння відеокодерів у блозі KeyJ ( заархівована версія ) цікавим читанням, воно порівнює H.264 проти Theora та інших.
Далі йде порівняння різних варіантів, які я пробував. Спочатку записане відео було 673 мільйони, зроблене на iPad за допомогою RecordMyScreen . Він триває близько 20 хвилин з роздільною здатністю 1024x768 (при цьому половина відео порожня, тому я обрізав його до 768x768). Щоб зменшити розмір, я знизив роздільну здатність до 480x480. Звуку немає.
Результати, беручи ті самі 1024x768 за основу (та застосовуючи обрізання, масштабування та фільтр ):
-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, тож прийміть результати з достатньою кількістю солі та проведіть власні тести.
-crf 23
. Але так, для encode-Once stream-many ви повинні використовувати щось на зразок -preset veryslow
. Не дивно, що це дуже добре справляється із захопленням екрану. Зазвичай вам не потрібно зменшувати масштаб, якщо ви не націлені на дуже низький бітрейт; залишення деталей, розподілених на більше пікселів, допомагає кодекам краще зберігати деталі. Артефакти навколо гострих країв, як правило, мають фіксовану кількість пікселів, тому більша різкість робить артефакти меншими. (Незважаючи на те, що менша кількість бітів на піксель означає більшу квантування, частина цього розмивається замість артефактів.)
Існує програма для виклику Mac і Windows Handbrake, я знаю, що це не командний рядок, а швидке відкриття файлу - виберіть формат вихідного файлу та приблизний розмір виводу, зберігаючи при цьому більшість хороших матеріалів про відео, тоді це добре , це просто графічний вигляд ffmpeg у найкращому вигляді ... Він підтримує введення з командного рядка для тих, хто важко пише текстовими повідомленнями. https://handbrake.fr/downloads.php
Я виявив бажання зробити це занадто недавно, тому створив інструмент під назвою Shrinkwrap, який використовує FFmpeg для перекодування відео, зберігаючи при цьому якомога більше оригінальних метаданих (включаючи мітки часу модифікації файлів).
Ви можете запустити його як контейнер докера:
docker run -v /path/to/your/videos:/vids bennetimo/shrinkwrap \
--input-extension mp4 --ffmpeg-opts crf=22,preset=fast /vids
Де:
Потім він рекурсивно знайде всі відеофайли, що відповідають розширенню, і перекодує їх у файли з однойменною -tc
суфіксом.
Додаткові опції конфігурації, пресети для GoPro і т.д., див Рідха .
Сподіваюся, це комусь допомагає!
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
для переліку всіх доступних кодеків)
-fs
змушує FFmpeg зупинити кодування після досягнення такого розміру файлу. Це не цільовий розмір файлу для розрахунку ставки. Якщо ви -b:v
помилилися, ваш файл у будь-якому випадку буде правильного розміру, а якщо ви помилилися, він буде меншим або скороченим.