Уменьшение размера видео в том же формате и уменьшение размера кадра

Этот вопрос может быть очень простым

Есть ли способ уменьшить размер / частоту кадра в формате со сжатием с потерями (WMV, MPEG), чтобы получить меньшее видео меньшего размера с тем же форматом.

Есть ли для этого API с открытым исходным кодом или проприетарный интерфейс?


person Vignesh    schedule 20.12.2010    source источник


Ответы (6)


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.

person Jason B    schedule 20.12.2010
comment
-b должен быть -b: v для скорости передачи видео - person Mr AH; 09.10.2012
comment
@MrAH, спасибо за обновление. Похоже, что интерфейс изменился с тех пор, как я опубликовал это. Раньше это было -b для битрейта видео и -ab для битрейта аудио, но теперь оно изменилось на -b:[stream specifier]. - person Jason B; 09.10.2012
comment
Команда немного неполная. Отсутствует то, что вам нужно также указать имя вашего выходного файла: ffmpeg -i <inputfilename> -s 640x480 -b 512k -vcodec mpeg1video -acodec copy <outputfilename> - person desmond13; 27.02.2016
comment
@JasonB Привет, дружище, это здорово. Вы знаете, как это сделать с помощью NodeJS? - person Chanaka De Silva; 18.01.2018
comment
@JasonB У меня есть одно видео размером 9 МБ, когда я использую ваш код, его размер увеличивается до 16 МБ, пожалуйста, помогите - person kunal; 08.03.2018
comment
вам не нужно указывать видеокодек, когда я его сломал. у меня сработало следующее ffmpeg -i input.mp4 -s 640x480 -b:v 512k -acodec copy output.mp4, которое уменьшило размер видео с 21M до 4,6M. - person simbo1905; 18.10.2018
comment
MPEG1 - устаревший кодек, не лучший вариант по сравнению с x264 или VP9. И часто вы получаете лучшие результаты с целевым качеством, а не с абсолютным битрейтом. например x264 по умолчанию -crf 23 вполне разумно для диапазона разрешений и типов контента. - person Peter Cordes; 21.09.2019

Если вы хотите сохранить тот же размер экрана, вы можете рассмотреть возможность использования коэффициента 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
person rebe100x    schedule 27.08.2014
comment
Хорошее предложение, за исключением того, что не используйте встроенный кодировщик AAC FFmpeg: это звучит как дерьмо. Если вам нужен AAC, по крайней мере, используйте libfdk-aac, или в наши дни предпочитают аудио Opus (полностью бесплатно / с открытым исходным кодом / без патентов, и конкурируют с лучшими кодировщиками AAC. Намного лучше, чем худшие кодеры AAC, такие как FFmpeg -c:a aac). Используйте -c:a libopus -b:a 64k или что-то в этом роде. (Но обратите внимание, что контейнеры MP4 не могут содержать звук Opus.) - person Peter Cordes; 21.09.2019
comment
-b:v 1M отменяет -crf. Не используйте оба. Просто используйте CRF. - person Peter Cordes; 21.09.2019

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

Ниже приводится сравнение различных вариантов, которые я пробовал. Записанное видео изначально было размером 673 МБ, снято на iPad с помощью RecordMyScreen. Он длится около 20 минут с разрешением 1024x768 (половина видео пуста, поэтому я обрезал его до 768x768). Чтобы уменьшить размер, я снизил разрешение до 480х480. Нет звука.

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

  • Без специальных опций: 95M (время кодирования: 1 мин. 19 с).
  • С добавлением только -b 512k размер упал до 77M (время кодирования: 1 мин. 17 с).
  • Только с -preset veryslow (и без -b) он стал 70M (время кодирования: 6 мин. 14 сек.)
  • И с -b 512k, и с -preset veryslow размер становится 77 МБ (на 100 КБ меньше, чем просто -b 512k).
  • С -preset veryslow -crf 28 я получаю файл размером 39M, на который ушло 5 минут 47 секунд (без разницы в визуальном качестве для меня).

N = 1, поэтому относитесь к результатам с недоверием и проводите собственные тесты.

person Lekensteyn    schedule 01.12.2013
comment
Без каких-либо параметров скорости x264 по умолчанию - -crf 23. Но да, для encode-once stream-many вы должны использовать что-то вроде -preset veryslow. Неудивительно, что это очень хорошо получается при захвате экрана. Обычно вам не нужно уменьшать масштаб, если вы не стремитесь к очень низкому битрейту; оставляя детализацию распределенными по большему количеству пикселей, как правило, помогает кодекам сохранять детализацию лучше. Артефакты вокруг острых краев, как правило, представляют собой фиксированное количество пикселей, поэтому более высокое разрешение уменьшает артефакты. (Несмотря на то, что меньшее количество бит на пиксель означает большее квантование, некоторые из них размываются вместо артефактов.) - person Peter Cordes; 21.09.2019

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

person Jimbo Bryant    schedule 29.06.2018
comment
он поддерживает командную строку handbrake.fr/docs/en/latest/cli/ cli-options.html - person kiranrk; 18.04.2021

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

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

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

Где:

  • / path / to / your / videos / - это то место, где находятся видео, которые вы хотите преобразовать
  • --input-extension - это тип видео, которое вы хотите обработать, здесь .mp4
  • --ffmpeg-opts - любые произвольные параметры FFmpeg, которые вы хотите использовать для настройки перекодировки.

Затем он рекурсивно найдет все видеофайлы, соответствующие расширению, и перекодирует их все в файлы с тем же именем и суффиксом -tc.

Дополнительные параметры конфигурации, предварительные настройки для GoPro и т. Д. См. В файле readme.

Надеюсь, это кому-то поможет!

person bennetimo    schedule 08.11.2018

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

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

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

  • -fs РАЗМЕР ФАЙЛА выходного видео в килобайтах

  • -vcodec videocodec (используйте ffmpeg -codecs, чтобы перечислить все доступные кодеки)

  • -acodec аудиокодек для вывода видео (копируйте только аудиопоток, не изменяйте)
person Rumroedeln    schedule 27.05.2018
comment
-fs заставляет FFmpeg прекращать кодирование после достижения этого размера файла. Это не целевой размер файла для расчета ставки. Если вы сделали -b:v правильно, ваш файл все равно будет правильного размера, а если вы ошиблись, он будет меньше или обрезан. - person Peter Cordes; 21.09.2019