Автор этой статьи, Го Вэньтао, является инженером-разработчиком в танцевальной труппе Ци.
Введение в эту статью
Прочитав эту статью, вы получите следующие знания:
Изучите основы видео.
Узнайте, что такое FFmpeg и некоторые распространенные варианты его использования.
Создайте простую прямую трансляцию видео с помощью FFmpeg.
Некоторое использование FFmpeg в NodeJS.
задний план
В эпоху, когда популярны короткие видеоролики, как программист, вы должны понимать: принципы и технологии, лежащие в основе видеомонтажа. В этой статье кратко описывается принцип композиции видео и часто используемые инструменты видеомонтажа, а такжеNodeJS
использование в .
Если вы хотите понять принцип видео, вам следует начать с принципа изображения.
Имиджевая основа
1. Пиксели
Картинка изображения — это наименьший цветовой блок изображения, представленный последовательностью чисел, которая называется пикселем (пиксель/пиксель).
Примечание. Пиксели доступны только в растровых изображениях и используются для записи растровых изображений.
Размер изображения, о котором мы говорим,1920*1080
Это означает, что длинная ширина имеет точку пикселя 1920 и 1080, затем один1920*1080
Общее количество пикселей в изображении равно:1920*1080 = 2073600
пикселей.
Как рассчитывается размер изображения?
Размер изображения:像素数量 * 像素大小 = 图片大小
,а такжеразмер пикселяа такжеглубина пикселейЕсть отношения.RGB
Указанный истинный цвет может отображаться256×256×256=16,777,216
, что мы обычно1600万色
, это полный спектр цветов, видимых человеческому глазу, за пределами бессмысленности.RGB
Глубина пикселя имеет1bit、4bit、8bit、16bit、24bit、32bit
, как вps
На изображении ниже выберите новый холст8bit
(относительно rgb каждый цвет занимает 8 бит), то это1 px = 3 * 8bit = 24bit
, широко известный как24 растровых изображения. По приведенной выше формуле можно рассчитать размер изображения на следующем рисунке:500 * 378 * 24 / 8 = 567000Byte = 567000Byte / 1024 = 553.7109375 Kb
, того же размера, что и изображение, отображаемое ps.
Однако реальный размер изображения часто намного меньше приведенного выше результата расчета, потому что все экспортированные изображения сжаты, и вы можете самостоятельно искать и изучать технологию сжатия изображений.
Основы видео
1. Какая связь между видео и изображением?
Видео — это результат покадрового соединения изображений, чем быстрее они соединяются, тем плавнее они выглядят.частота кадров(то есть количество кадров в секунду при воспроизведении изображений в секунду) для измерения плавности видео. Затем алгоритм, основанный на размере изображения, может рассчитать размер видео.
视频的大小 = 时长(秒) * 帧率(FPS)* 图片大小
;
Так1920×1280
Разрешение, 30FPS, размер 1-секундного видео:1920 * 1280 * 24 / 8 * 30 / 1024 / 1024 = 210.9375 M
, то для 1-часового видео потребуется:210.9 * 60 * 60 / 1024 = 741.4453125 G
, я не могу не задаться вопросом, почему я загружаю только более 1 ГБ блокбастеров? Не паникуйте, если видео такое простое, то мы слишком наивны, поэтому имеем следующее"Кодирование видео".
2. Откуда видео?
несколько концепций
-
Кадр: неподвижное изображение, которое является наименьшей единицей видео.
-
Частота кадров (FPS): количество изображений, воспроизводимых в секунду.
-
Битрейт: поток данных, используемый видеофайлом в единицу времени, который определяет качество и размер видео, в кбит/с или Мбит/с. Вообще говоря, при одном и том же разрешении, чем больше кодовый поток видеофайла, тем меньше коэффициент сжатия и тем выше качество изображения. Чем больше битовый поток, тем выше частота дискретизации в единицу времени, чем выше поток данных, тем выше точность, чем ближе обработанный файл к исходному файлу, тем лучше качество изображения, тем четче качество изображения и тем выше требуется декодирующая способность устройства воспроизведения.
码率的常见三种模式: - CBR - 全程码率恒定 - 文件大小可预测 - 编码压力小,直播常用 - VBR - 码率可变 - 简单场景码率低,复杂场景码率高 - CRF - 固定质量模式 - CRF值越低,视频看起来质量越高
видео композиция
Видео и аудио — как рис и блюда, а формат упаковки — как миска.
Уведомление:все ниже
视频
оба представляют包含音频的视频
.
1. Формат инкапсуляции видео
Распространенные форматы упаковки:MP4、AVI、FLV、mov、RMVB、MKV、WMV、3GP、ASF
Ждать.
2. Формат кодирования
Кодирование видео — это описание преобразования одного видеоформата в другой видеоформат с использованием алгоритма сжатия видео, то же самое справедливо и для кодирования аудио.
Распространенные форматы кодирования видео:AC-1
,MPEG2/H.262
,VP8
,MPEG4
,VP9
,H.261
,H.263
,H.264
,H.265
Ждать.
Распространенные форматы кодирования аудио:WMA
,MP3
,AC-3
,AAC
,APE
,FLAC
,WAV
Ждать.
Принцип сжатия видео
Он в основном сжимает пиксельные данные видео (RGB, YUV и т. д.) в видеопоток, тем самым уменьшая объем видеоданных, то есть обрабатывая пиксели.
YUV:а также
RGB
Это же формат с цветовой кодировкой, по сравнению сRGB
Лучше на сжатие. Среди них «Y» представляет яркость (яркость или яркость), то есть значение шкалы серого; в то время как «U» и «V» представляют цветность (цветность или цветность), которые используются для описания цвета и насыщенности изображения. изображение цвет указанного пикселя.
Существует два типа сжатия видео::
1. Внутрикадровое сжатие
Также называемое пространственным сжатием, аналогично сжатию изображений, это алгоритм сжатия с потерями, который не может обеспечить очень высокую степень сжатия.
2. Межкадровое сжатие
В основном это происходит в процессе записи ключевых кадров и сжатия избыточной информации последовательных кадров между ключевыми кадрами (одна и та же площадь пикселей в последовательных кадрах).
Для записи ключевых кадров кадр видео делится на три категории:
- I-кадр: Внутрикадровый кадр, который может отображать наиболее полное изображение и имеет небольшое сжимаемое пространство.Процесс кодирования относится к внутрикадровому кодированию.
- Кадр P: кадр прямого кодирования с предсказанием (кадр с предсказанием), вам нужно обратиться к предыдущему кадру I или кадру P, чтобы найти различные части для кодирования, и степень сжатия относительно высока.
- B-кадр Двунаправленное предсказание, то есть B-кадр записывает разницу между текущим кадром и предыдущим кадром. То есть для декодирования В-кадра необходимо декодировать не только предыдущее кэшированное изображение, но и последующее изображение, а конечное изображение получается путем наложения переднего и заднего изображений с данными этого кадра. Кадр B имеет высокую степень сжатия, но требует более высокой производительности декодирования.
Значение GOP (группа изображений)
Кодер кодирует несколько изображений и создает GOP сегмент за сегментом. Сколько кадров включено в последовательность каждой группы кадров IPB, то есть сколько кадров должно пройти после окончания I-кадра, прежде чем может появиться следующий I-кадр. Следовательно, чем больше значение GOP при той же скорости передачи данных, тем больше B-кадров и P-кадров и тем выше качество видео.
Используется в процессе сжатия или распаковки видеоКодек (кодек). Общий процесс может:
Процесс кодирования видео:
Изображение ниже взято изсеть обмена мгновенными сообщениями.
Процесс декодирования видео:
Принципы сжатия аудио
Сжатие звука заключается в максимально возможном сжатии сигнала аудиоданных для удаления избыточной информации при условии, что сигнал не искажается с точки зрения слуха. К избыточным сигналам относятся аудиосигналы за пределами диапазона человеческого слуха и маскированные аудиосигналы. Например, частотный диапазон звукового сигнала, который может воспринимать человеческое ухо, составляет от 20 Гц до 20 кГц, а другие частоты, которые человеческое ухо не воспринимает, можно рассматривать как избыточные сигналы. Кроме того, согласно физиологическим и психоакустическим явлениям человеческого слуха, при одновременном наличии сильного и слабого сигналов слабый сигнал будет маскироваться сильным сигналом и не может быть услышан, поэтому слабый сигнал можно считать как избыточный сигнал. Не отправлять.
Сжатие звука не является главным героем сегодняшнего дня. Если вы хотите узнать больше, вы можете обратиться к следующим ссылкам:
Encyclopedia.Baidu.com/item/%E9%9F…
Woohoo. Камилла. Talent/how-audio-from…
FFmpeg
1. Что такое FFmpeg?
FFmpeg is a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata.
Проще говоря, это кроссплатформенная программа для обработки видео.
2. Принцип FFmpeg
Весь процесс можно описать так: демультиплексирование => декодирование => кодирование => мультиплексирование.
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|
3. Установка FFmpeg
FFmpeg делится на 3 версии: Static, Shared, Dev.
Установка Mac:
brew install ffmpeg
Для других установок см.Официальный сайт.
4. Использование FFMPEG
Он может кодировать различные компоненты видео, что является более полным для формата кодирования аудио и видео. Например: преобразование видеоконтейнеров, сжатие, перехват видео, снимок экрана, фильтрация, извлечение аудио и т. д., очень мощные.
Синтаксис командной строки:
ffmpeg [全局参数] [输入文件参数] -i [输入文件] [输出文件参数] [输出文件]
Информация о видео:
// 获取视频信息
ffmpeg -i input.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input2.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
encoder : Lavf58.29.100
description : Packed by Bilibili XCoder v2.0.2
Duration: 00:08:24.45, start: 0.000000, bitrate: 2180 kb/s // 时长,码率
Stream #0:0(und): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv), 1920x1080 [SAR 1:1 DAR 16:9], 2046 kb/s, 25 fps, 25 tbr, 16k tbn, 25 tbc (default) // 第一个流是视频流,编码格式是hevc(封装格式为hev1),每一帧表示为yuv420p,分辨率1920*1080,码率2046kb/s, fps为25。
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default) // 第二个流是音频流,编码格式是aac(封装格式为mp4a)采样率是44100 Hz,声道是立体声,码率92Kbit/s。
Metadata:
handler_name : SoundHandler
Преобразование кодовой скорости:
ffmpeg -i input.mp4 -b:v 64k -bufsize 64k output.mp4
Преобразование частоты кадров:
ffmpeg -i input.mp4 -r 5 output.mp4
Преобразование разрешения:
ffmpeg -i input.mp4 -vf scale=480:-1 output.mp4 // 1080p 转为 480p
Скорость видео:
ffmpeg -i test1 "setpts=PTS/5" test4.mp4 // 视频5倍速转换
fmpeg -i input.mp4 -filter:a "atempo=2.0" 4s.mp4 // 音频2倍速播放
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" -vn 4s.mp4 // 音视频同时2倍速
Извлечь аудио и видео:
ffmpeg -i input.mp4 -an output.mp4 //提取视频
ffmpeg -i input.mp4 -vn output.mp3 //提取音频
Преобразование соотношения сторон видео:
ffmpeg -i input.mp4 -aspect 21:9 output.mp4
Преобразование контейнера видео:
ffmpeg -i input.mp4 output.avi
Скриншот видео:
ffmpeg -ss 00:00:05 -i input.mp4 -vframes 1 -q:v 5 -f image2 pic-%03d.jpeg
// -ss 00:00:05 从第五秒开始 -vframes 1 只截取1帧 -q:v 5 图片质量1-5
Видеоклип:
ffmpeg -ss 00:00:02 -i input.mp4 -t 6.5 -c copy cut.mp4
ffmpeg -ss 00:00:02 -i input.mp4 -to 00:00:10 -c copy cut.mp4
Создание GIF из последовательных изображений или видео:
ffmpeg -i output.mp4 -to 10 -r 30 -vf scale=100:-1 gg.gif // 截取视频某个部分生成gif 100:-1 指定宽度,高度保持原始比例
ffmpeg -r 5 -i pic-%03d.jpeg 11.gif // 多图生成gif
// 图片还可生成视频
ffmpeg -r 20 -i pic-%03d.jpeg gif.mp4
ffmpeg -f concat -i "concat:part1.mp4|part2.mp4|3.mp4|part4.mp4" -c copy output.mp4 // 多个视频拼接成一个
Добавьте фильтры к изображениям или видео:
// 模糊滤镜
ffmpeg -y -i pic-012.jpeg -vf boxblur=7 blur.jpeg
// 变色
ffmpeg -i pic-012.jpeg -vf colorbalance=rm=1 colorbalance1.jpg // 调整rgb某个维度的权重实现变色。
ffmpeg -i pic-012.jpeg -vf colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3 colorchannelmixer1.jpg // 对rgba四个通道进行重新计算,并分别给定权重比例。
ffmpeg -i pic-012.jpeg -vf hue=h=30:s=1 hue1.jpg // 改变色调,相当在调色板上调色
ffmpeg -i pic-012.jpeg -vf lutyuv="y=negval:u=negval:v=negval" lutyuv1.jpg // lutyuv用于yuv颜色空间
ffmpeg -i pic-012.jpeg -vf negate=0 negate1.jpg // 反转
ffmpeg -i pic-012.jpeg -vf swapuv swapuv1.jpg // UV 互换
ffmpeg -i pic-012.jpeg -vf crop=w=200:h=300:x=500:y=800 crop1.jpg // 裁剪
Добавить водный знак:
ffmpeg -i input.mp4 -i pic-012.jpeg -filter_complex "[1:v] scale=176:144 [logo];[0:v][logo]overlay=x=0:y=0" out.mp4 //给视频添加图片水印
ffmpeg -i input.mp4 -vf "drawtext=fontsize=100:fontcolor=white:alpha=0.3:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':y=h-line_h-100:x=(w-text_w)/2" output22.mp4// 添加文字水印
ffmpeg -i input.mp4 -i pic-012.jpeg -filter_complex "[1:v] scale=176:144 [logo];[0:v][logo]overlay=x=0:y=0" out.mp4
ffmpeg -i input.mp4 -vf drawtext="fontsize=100:text='我是水印':fontcolor=green:enable=lt(mod(t\,3)\,1)" interval-sy.mp4
// t 时间,s
// mod(t\,2) 计算t%2
// lt(mod(t\,2)\,1) 如果mod(t\,2)<1,返回1,否则返回0
// enable=lt(mod(t\,2)\,1) 每隔1s显示一次水印,enable=lt(mod(t\,3)\,1) 每隔3s.
Добавьте субтитры:
// 第一步 用you-get下载B站视频
// 第二步 用 danmaku2ass.py 转换弹幕 https://github.com/m13253/danmaku2ass
// 第三步 可以用ffmpeg转换弹幕
ffpmeg -i input.ass input.srt
// 第四步 给视频添加字幕或弹幕 字幕可添加多个
ffmpeg -i input.mp4 -vf subtitles=input.ass output.mp4
Добавить обложку к аудио:
ffmpeg -loop 1 -i cover.jpg -i input.mp3 -c:v libx264 -c:a aac -b:a 192k -shortest output.mp4
// -loop 1表示一直循环, -shortest 音频结束视频输出就结束
Видео картинка в картинке:
ffmpeg -re -i input.mp4 -vf "movie=output.mp4,scale = 480*320[test]; [in][test] overlay [out]" -vcodec libx264 videoInvideo.mp4
Дуглас:
ffmpeg -y -i input.mp4 -i input.mp4 \
-i input.mp4 -i input.mp4 \
-filter_complex "nullsrc=size=640x480[base]; \
[0:v]scale=320x240[topleft]; \
[1:v]scale=320x240[topright]; \
[2:v]scale=320x240[bottomleft]; \
[3:v]scale=320x240[bottomright]; \
[base][topleft]overlay=shortest=1[tmp1]; \
[tmp1][topright]overlay=shortest=1:x=320[tmp2]; \
[tmp2][bottomleft]overlay=shortest=1:y=240[tmp3]; \
[tmp3][bottomright]overlay=shortest=1:x=320:y=240" \
-vcodec libx264 9_video_filtered.flv
// nullsrc创建画布
Сжатие видео:
ffmpeg -i input.mp3 -ab 128 output.mp3 // 压缩音频
ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4 // 压缩视频
Прямая трансляция видео:
// 录制视频保存在本地
ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -f h264 -r 30 ~/Downloads/test.h264
// 推送已下载在文件夹的视频
ffmpeg -re -i ~/Downloads/xxx.mp4 -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:1935/live
// 录制桌面
ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://localhost:1935/rtmplive/room
// 录制桌面和麦克风
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/live/room
// 录制桌面和麦克风,并打开摄像头拍摄
ffmpeg -f avfoundation -framerate 30 -i "1:0" \-f avfoundation -framerate 30 -video_size 640x480 -i "0" \-c:v libx264 -preset ultrafast \-filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:2016/rtmplive/room
Живая демонстрация:
-
поддержка установки
rtmp
Образ докера:docker pull tiangolo/nginx-rtmp
-
запускать
tiangolo/nginx-rtmp
контейнер:docker run -d -p 1935:1935 --name nginx-rtmp tiangolo/nginx-rtmp
Проверитьnginx
Конфигурация:docker exec -it nginx-rtmp /bin/bash
Адрес пуш-потока:
rtmp://10.17.8.189:1935/live
-
Пуш-поток Ffmpeg:
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/live/room
-
поддержка с поддержкой
rtmp
игрок (IINA) илиffplay
Открыть:ffplay rtmp://10.17.8.189:1935/live
Простая живая демонстрация запущена и работает.
5. Использование Node в FFmpeg
Fluent-ffmpegбудет сложноffmpegКоманды абстрагируются в модули NodeJS при условии, что система установленаFFmpeg.
какое-то простое использование
// 视频信息
ffmpeg.ffprobe(input, function (err, metadata) {
console.dir(metadata);
});
// 提取音频
ffmpeg(input)
.audioCodec("libmp3lame")
.on("error", function (err) {
console.log("发生错误: " + err.message);
})
.on("end", function () {
console.log("提取音频完成 🍻🍻!");
})
.save(resOut);
// 提取视频
ffmpeg(input)
.noAudio()
.on("error", function (err) {
console.log("发生错误: " + err.message);
})
.on("end", function () {
console.log("提取视频完成 🍻🍻!");
})
.save(resOut);
Суммировать
Напомним, видео в самом широком смысле состоит из:аудиоа такжевидеосостоит из двух частей, каждая из которых имеет соответствующийсоответствующие соглашения о кодировании,видеоконтейнерЭто комбинация аудио и видео в разных форматах кодирования.Формат пакета. Формат кодирования видео в основном сжимает размер видео, которое делится наВнутрикадровое сжатиеа такжемежкадровое сжатие, межкадровое сжатие в основном осуществляется путем записиКлючевой кадрформа для сжатия.
FFmpeg
Это программа для обработки аудио и кодирования видео.Основные принципы:demuxer => decoder => encoder => muxer
.
Fluent-ffmpeg
будет сложноffmpeg
Команда абстрагируется вnodeJs
модулей, при условии, что система установленаFFmpeg
, который может использоваться интерфейсными инженерами для обработки множества аудио- и видеоопераций.
рыть нору
Следующее уведомление:FFmpeg
а такжеwasm
Столкновение в браузере
Ссылки на эту статью
- Сеть обмена мгновенными сообщениями — введение в самую популярную технологию кодирования видео в истории:52IM.net/thread-2840…
- Краткая книга - базовые знания аудио и видео:у-у-у. Краткое описание.com/afraid/614 не 3 ой 6 ой 6…
- Фильтры для достижения различных эффектов изображения | Видео-фильтры | avfilter | Обесцвечивание:woohoo.geek-share.com/detail/2763…
- Ruan Yifeng: Введение в руководство по обработке видео FFmpeg:Уууу. Руань Ифэн.com/blog/2020/0…