При написании технической документации часто необходимо для удобства изложения вставлять несколько коротких видеоресурсов. Например, какие-то видеоролики с операциями, какие-то классические видеоклипы, какие-то научно-популярные анимации и т. д. Поскольку местом отображения обычно является веб-страница, и если вставляются такие ресурсы, как видео, то обычно требуется дополнительное хранилище и поддержка доступного видеоплеера, что очень неудобно. Для воспроизведения операций командной строки мы можем использовать Asciinema,Однако это решение не может моделировать нетерминальные операции. Распространенным решением является преобразование необходимых ресурсов в веб-страницы. GIF、WEBP Формат и другие анимации. Учитывая, что основные браузеры GIF поддержка формата является наиболее стабильной, поэтому в большинстве случаев мы хотим преобразовать короткое видео для отображения в GIF формат для удобной вставки непосредственно в документ.
Конвертировать видео в GIF И чтобы GIF В процессе настройки будет много подводных камней, таких как серьезная разница в цвете, неподходящее разрешение, GIF. Такие проблемы, как чрезмерное использование памяти. Иногда перед преобразованием мы также хотим выполнить некоторую обрезку и т. д. На самом деле существует множество инструментов для обработки изображений, таких как ImageMagick из convert инструмент, или gifsicle Инструменты и даже некоторая проволока существуют из Преобразование формата Инструмент GIF (крайне не рекомендуется),сложно использовать). Но когда существуют процессы видеоподобной информации,Эти инструменты на самом деле не очень подходят. Ведь исходные данные сами по себе являются видео,По сравнению с первым преобразованием видео в GIF Затем проделайте операцию, завершите операцию прямо на видео и, наконец, преобразуйте в GIF причинаиз Меньше информации будет потеряно,Эффект будет лучше。Эта статья в основном основана на FFmpeg Кратко опишите команды прибытия, которые часто используются в процессе преобразования, и представьте некоторые принципы решения этих проблем.
В типичном сценарии существования перед съемкой мы обычно делаем следующие шаги:
Ниже будет дано краткое введение, основанное на этом процессе и примерах. Локальный из ffmpeg Версия 4.4.1.
Если мы сможем получить видеофайл о прибытии,лучше всего. Однако во многих случаях нам все равно необходимо использовать некоторые инструменты записи экрана для захвата,Однако, будучи пациентом с системной мизофобией,Лично я не рекомендую скачивать какие-то грязные исходники.из Экран записиинструмент Или это может быть очень дорого, но обычные люди вообще не смогут им воспользоваться.приезжать Сколько функцийизобработка программное обеспечение для видео.
Вышеперечисленных инструментов вполне достаточно.
Будь то ваше собственное видео,Или записать экран, чтобы сделать видео?,Нам часто хочется отрезать какие-то бесполезные фрагменты в начале и конце. Конечно, мы можем использовать обычные инструменты редактирования.,Например Mac начальствоиз imovie ждать. Но, очевидно, мы не хотим убивать курицу ножом, одна или две команды могут решить проблему.
перехвачено из 00:00:10 Начинать 10 Секунды из периода времени из видео:
$ ffmpeg -i sample.mov -ss 00:00:10 -t 00:00:10 output1.mov
(в -ss Указывает время начала, -t Указывает на перехватизпродолжительность)
перехвачено из 00:00:10 приезжать 00:00:20 период времениизвидео:
$ ffmpeg -i sample.mov -ss 00:00:10 -to 00:00:20 output2.mov
(в -ss Указывает время начала, -to указывает время окончания)
Убедитесь, что они одинаковы, и подтвердите продолжительность видео:
$ diff output1.mov output2.mov
$ ffprobe -v error -show_entries format=duration sample.mov
[FORMAT]
duration=10.000000
[/FORMAT]
(в -v error Это необходимо для блокировки первоначальной печати информации о версии)
Поскольку видео, которое нам нужно отобразить, встроено в документ или веб-страницу, само разрешение изображения не очень требовательно. В настоящее время соответствующее уменьшение разрешения полезно как для размера файла, так и для удобства отображения. Используемый инструмент — ffmpeg из графика фильтра масштаба.
Подтвердите исходное разрешение видео:
$ ffprobe -v error -show_entries stream=width,height sample.mov
[STREAM]
width=1560
height=1148
[/STREAM]
Принудительное пропорциональное масштабирование, установка длины и ширины:
$ ffmpeg -i sample.mov -vf scale=720:530 output1.mov
(в 720 — ширина, 530 — высота, причем ни ширина, ни высота не могут быть нечетными числами)
Масштабирование с фиксированным соотношением, заданная ширина, адаптивная высота:
$ ffmpeg -i sample.mov -vf scale=720:-1 output2.mov
Масштабирование с фиксированным соотношением, заданная высота, адаптивная ширина:
$ ffmpeg -i sample.mov -vf scale=-1:530 output3.mov
(Изменить адаптивную часть настройки на -1,Если адаптивная часть снова масштабируется,но Можетнастраиватьдля -2 ,-3 ждать)
Выберите собственный алгоритм масштабирования, дополнительный алгоритм виден.ScalerOptions:
$ ffmpeg -i sample.mov -vf scale=-1:530:flags=lanczos output4.mov
(Существует множество алгоритмов масштабирования. Если эффект неудовлетворительный, можно попробовать разные. По умолчанию используется бикубический алгоритм)
Частота кадров видео обычно относительно высока, и мы GIF Требования, как правило, не такие высокие. Чтобы уменьшить размер изображения, мы можем вручную настроить частоту кадров, чтобы добиться наилучшего баланса между размером изображения и удобством пользователя. Обычно частота кадров видео обычно 60 fps . Для обычных фотографий 20 кадров в секунду уже достаточно, приберегите несколько слов, 10 fps ,5 fps Это нормально смотреть, но мне придется испытать это на себе.
Подтвердите исходную частоту кадров видео:
$ ffprobe -v error -show_entries stream=r_frame_rate sample.mov
[STREAM]
r_frame_rate=60/1
[/STREAM]
(Частота кадров исходного видео — 60 кадров в секунду)
Настройте частоту кадров до 20:
$ ffmpeg -i sample.mov -r 20 output1.mov
Для записи экрана,Может быть, мы двигаемся медленно,Я надеюсь, что существующие позволят немного ускорить отображение, повысить эффективность отображения и уменьшить размер видео. Или само видео очень быстрое,Мы хотим сыграть медленную игру. В таких случаях нам лучше заранее что-то сделать со скоростью видео.
Настройте скорость видео в 5 раз быстрее (длительность * 0,2):
$ ffmpeg -i sample.mov -filter:v "setpts=0.2*PTS" output1.mov
Отрегулируйте скорость видео в 2 раза медленнее (продолжительность x 2):
$ ffmpeg -i sample.mov -filter:v "setpts=2*PTS" output2.mov
(принциппроходить Корректированиевидеорамкасерединаиз PTS Отображение временной метки для регулировки скорости)
Следует отметить, что из,Корректированиеставканазад,Частота кадров остается прежней. Поэтому после ускорения, а затем замедления видео до исходной скорости видео,,Информация будет потеряна по сравнению с исходным видео.
Фактически, само видео H264 имеет очень высокую скорость видеоконтента.,Если вы хотите пойти дальше,В принципе может толькопроходитьнекоторые с потерямиизформа。нас Можетпроходить Корректирование x264, x265, а также libvpx серединаиз Constant Rate Factor параметры для выполнения некоторыхповреждающийиметь дело с。Этот параметрценитьсуществовать 0 приезжать 51 Среди них, чем больше значение, тем больше коэффициент потерь и тем лучше скорость сжатия. Обычно мы берем Значение 23 можно скорректировать до 30+, если оно более радикальное.
Корректирование crf ценитьприезжать30 :
$ ffmpeg -i sample.mov -crf 30 output1.mov
Сравните размеры двух:
$ ls -lah sample.mov output1.mov
-rw-r--r-- 1 myths staff 1.5M May 1 17:31 sample.mov
-rw-r--r--@ 1 myths staff 1.0M May 1 17:51 output1.mov
Видно, что на видео действительно какое-то сжатие.,Однако вы обнаружите, что качество GIF будет несколько снижено. Обязателен ли параметр Корректирование?,Делать выбор необходимо исходя из реальной ситуации.
По умолчанию ffmpeg поддерживает автоматическую обработку преобразования на основе суффикса имени выходного файла. формата,Очень удобно. Но если вы думаете, что можете использовать это, не думая,Это не могло быть более неправильным.
Типичный метод преобразования ошибок:
$ ffmpeg -i sample.mov output.gif
В чем проблема? Давайте проверим продолжительность видео, чтобы узнать:
$ ffprobe -v error -show_entries format=duration sample.mov
[FORMAT]
duration=62.000000
[/FORMAT]
$ ffprobe -v error -show_entries format=duration output.gif
[FORMAT]
duration=173.680000
[/FORMAT]
Мы обнаружили, что после преобразования из GIF Длина видео на самом деле отличается от оригинального видео. После открытия теста выяснилось, что правильный GIF Это намного медленнее, чем оригинальное видео.
Повторная проверка частоты кадров выявила проблему:
$ ffprobe -v error -show_entries stream=r_frame_rate,avg_frame_rate sample.mov
[STREAM]
r_frame_rate=60/1
avg_frame_rate=60/1
[/STREAM]
$ ffprobe -v error -show_entries stream=r_frame_rate,avg_frame_rate output.gif
[STREAM]
r_frame_rate=50/1
avg_frame_rate=257/12
[/STREAM]
Фактическая частота кадров GIF из фактически стала меньше, неудивительно, что видео стало длиннее. Рассчитать коэффициент также можно:
173.680000/62.000000≈(60/1)/(257/12)
В этом случае мы можем принудительно установить частоту кадров:
$ ffmpeg -i sample.mov -r 20 output2.gif
$ ffprobe -v error -show_entries stream=r_frame_rate,avg_frame_rate,duration output2.gif
[STREAM]
r_frame_rate=20/1
avg_frame_rate=20/1
duration=62.050000
[/STREAM]
Таким образом, продолжительность соответствует исходному видео.,Частота кадров также является нашей настройкой частоты кадров. Конкретная причина неизвестна,Но вывод таковПри конвертации видео в GIF обязательно переукажите частоту кадров.。
ты можешь знать,Видео другое,Цветовая палитра PNGиз содержит всего 256 цветов. По умолчанию,Эти 256 цветов будут распределены максимально равномерно по всему цветовому пространству. В результате некоторые изображения получаются с относительно небольшой цветовой дискриминацией.,Может произойти размытие цвета.
首先нас生成一张ВнизНе оптимизированоВнизизкартина:
$ ffmpeg -i sample.mov -r 20 output-raw.gif
Результат следующий:
В это время вам нужно использовать правильноекартина Проведите Внизобщая ситуация Оптимизация палитры:
$ ffmpeg -i sample.mov -r 20 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output-palette.gif
Результат следующий:
Присмотритесь к обоим после увеличения.,для тебя это будет очевидноиз ОбнаружитьЦвет исходного изображения превратился в множество мелких частиц.,И после использования оптимизации цветовой палитры,фон действительно показывает сплошной цвет。
конечно,Если у вас высокие требования к качеству изображения,также МожетЗапись палитры индивидуально для каждого кадра(Ценакартинастанет намного больше):
$ ffmpeg -i sample.mov -r 20 -vf "split[s0][s1];[s0]palettegen=stats_mode=single [p];[s1][p]paletteuse=new=1" output-palette-single.gif
Если картина имеет относительно большую степень движения,также Может Изменить некоторыеПараметры защиты от сотрясений( dither = none / bayer / heckbert / floyd_steinberg / sierra2 / sierra2_4a), если не указано, по умолчанию используется sierra2_4a . Например:
$ ffmpeg -i sample.mov -r 20 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse=dither=none" output-palette-none.gif
$ ffmpeg -i sample.mov -r 20 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse=dither=bayer" output-palette-bayer.gif
$ ffmpeg -i sample.mov -r 20 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse=dither=heckbert" output-palette-heckbert.gif
Наконец, взгляните на размер изображения после добавления Оптимизации палитры:
$ ls -lah
-rw-r--r-- 1 myths staff 2.2M May 2 11:36 output-palette-bayer.gif
-rw-r--r-- 1 myths staff 2.5M May 2 11:36 output-palette-heckbert.gif
-rw-r--r-- 1 myths staff 1.9M May 2 11:40 output-palette-none.gif
-rw-r--r-- 1 myths staff 32M May 2 11:29 output-palette-single.gif
-rw-r--r--@ 1 myths staff 2.7M May 2 11:15 output-palette.gif
-rw-r--r-- 1 myths staff 1.0M May 2 11:30 output-raw.gif
-rw-r--r--@ 1 myths staff 198K May 1 22:15 sample.mov
Очевидно, что палитра записывается каждый кадр ( output-palette-single.gif ) Максимум не проводите Оптимизацию; у палитры самая маленькая картинка, но худшее качество( output-raw.gif ); без использования стратегии защиты от встряхивания (); output-palette-none.gif ) Это уменьшит изображение и не повлияет на его внешний вид.
проходить ffmpeg Вы также можете настраивать изображения с учетом времени цикла. После завершения воспроизведения изображения оно начнет воспроизводиться снова по умолчанию. Если вы хотите изменить эту функцию, вы можете продолжить. -loop Параметр указывает метод цикла или указывает -final_delay Интервал настройки параметров:
Чтобы запретить запуск GIF после воспроизведения:
$ ffmpeg -i sample.mov -r 20 -loop -1 output.gif
gif muxer Поддерживать -loop и -final_delay Описание параметра можно посмотреть командой проводить:
$ ffmpeg -v error -h muxer=gif
Muxer gif [CompuServe Graphics Interchange Format (GIF)]:
Common extensions: gif.
Mime type: image/gif.
Default video codec: gif.
GIF muxer AVOptions:
-loop <int> E.......... Number of times to loop the output: -1 - no loop, 0 - infinite loop (from -1 to 65535) (default 0)
-final_delay <int> E.......... Force delay (in centiseconds) after the last frame (from -1 to 65535) (default -1)
Это немного сбивает с толку,В дополнение к бесконечному повторению (0) и отсутствию повторения (-1) и значению з,если хочешь повторить N раз, то это -loop Параметры должны быть установлены на N+1 。。。
Наконец, последовательно запишите изменения размера одного из моих тестовых ресурсов после описанной выше обработки:
GIF Эффект сжатия формата все еще намного хуже, чем у обычного видеоформата, но существующие попытки обеспечить качество изображения основаны на контроле размера изображения. 2M В целом это еще приемлемо.
метод сжатия gif изображения (командная строка)
Speeding up/slowing down video
How do I convert a video to GIF using ffmpeg, with reasonable quality?