以下理论部分,实践和命令直接看 命令实践
关于视频处理的重要概念
- 编解码:分软件和硬件
- 硬件加速:支持英特尔、英伟达、AMD 等显卡加速
- 视频质量:帧率、分辨率、码率
- 修改视频:剪接、合并、裁剪黑边等(复杂的操作建议上剪辑工具)
快速概念入门
一、编解码
编码将媒体数据编译成可播放的媒体文件 ---> 媒体文件打开调用对应的编码方式将其解码播放。
简单理解为:存储媒体(编码) → 打开媒体(解码);
复杂的是,编解码有很多种不同的方式,如:h264、h265、hevc、av1等。编解方式需要对应才能顺利打开媒体,多种格式的存在一方面是软硬件迭代,另一方面是应对不同的场景。
二、硬件加速
处理媒体是计算机消耗最多性能的工作,纯粹考软件的方式处理是非常低效的。这时就需要硬件的加入,如 GPU 加速。
实际上是通过厂商的硬件驱动去进行加速编码。
以下 API 是各系统与各硬件厂商的支持情况。
同样的编码动作,开启硬件加速少则速度翻倍,甚至可以翻几倍(看显卡性能)
三、视频质量
- 帧率(Frame Rate):帧率是指每秒显示的图像帧数。它决定了视频播放时的流畅度,通常以"每秒帧数"(fps)来衡量。常见的帧率包括 24fps、30fps 和 60fps。越低帧率看的画面就像卡卡的感觉。【目前60帧暂时是比较舒适的】
- 分辨率(Resolution):分辨率是指图像或视频的清晰度和细节水平。它通常以像素为单位来表示,例如1920x1080表示宽度为1920像素,高度为1080像素。分辨率越高,图像越清晰,但文件大小也会增加。常见的视频分辨率包括720p(1280x720)、1080p(1920x1080)和4K(3840x2160)等。
- 码率(Bitrate):码率是指在视频或音频中传输的数据量,通常以每秒的比特数(bps)来表示。它影响视频或音频文件的质量和文件大小。较高的码率通常会导致更高质量的输出,但也会增加文件大小。码率与视频质量和分辨率密切相关,因为更高的分辨率和质量通常需要更高的码率来保持良好的表现。
小结:**帧率决定流畅、分辨率决定清晰度、码率确定画面质量。**判断视频好坏最直接的公式:码率 > 分辨率 ≈ 帧率。(前提是720p 24帧,如果有错就一定是我错)
什么是 ffmpeg
关键:媒体转换器、命令行操作工具。Ffmpeg
是一个通用的媒体转换器。它可以读取各种各样的输入-包括实时抓取/记录设备-过滤,并将它们转换成不同的输出格式。
ffmpeg 的工作流
markdown
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|
编、解码器与硬件加速
查看硬件加速技术
普遍有以下几种技术,不同的系统环境和硬件会有所不同。
ffmpeg -hwaccels
- qsv:intel显卡的快速视频同步技术(quick sync video)
- nvenc:nvidia显卡的硬件视频编码器(nvidia hardware video encoder)
- cuvid:nvdec的旧称,只有解码端。
- cuda: 同上
- amf:amd显卡的amf硬件编码器(amd hardware encoder)
查看编、解码器
下面的代码中如使用 bash 命令,将 sls 更换为 grep 即可。
解码器基本是英特尔 qsv
和 NVIDIA cuvid
的天下,没AMD什么事了
bash
ffmpeg -decoders | sls h264
#VFS..D h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
#V....D h264_qsv H264 video (Intel Quick Sync Video acceleration) (codec h264)
#V..... h264_cuvid Nvidia CUVID H264 decoder (codec h264)
查看硬件支持的编码器(一般硬件支持的编码较少,独显或更高规格的显卡才支持)
bash
ffmpeg -encoders | sls h264
#V....D h264_amf AMD AMF H.264 Encoder (codec h264)
#V....D h264_mf H264 via MediaFoundation (codec h264)
#V....D h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
#V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)
码率、分辨率、帧率
影响视频文件大小比重:码率 > 分辨率 > 帧率
- 码率:
-b:v 4500k
(4500k-高质量,2000k-勉强接受,文件大小与质量比较适中) - 分辨率:
-s 1280x720
orhd720
、hd1080
- 帧率:
-crf 24
影响文件大小不如码率和分辨率,一般不需要设置,低于 24 帧会严重影响观感
命令实践
视频处理
一、快速剪辑
从开始到结束,假如结束无需剪辑即可忽略
-vcodec copy -acodec copy
意思是对音视频源不作处理,或者使用 -c copy
不对音视频作处理
go
ffmpeg -i test.mp4 -ss 00:00:09 -to 00:00:44 -vcodec copy -acodec copy output.mp4
二、多个视频剪辑
💡 windows 的版本若无法使用,可通过 wsl 运行 Linux 子系统使用
ini
ffmpeg -i test.mp4 -filter_complex \
"[0:v]trim=start=0:end=17,setpts=PTS-STARTPTS[a]; \
[0:v]trim=start=25:end=110,setpts=PTS-STARTPTS[b]; \
[a][b]concat[out];" -map [out] out.mp4
三、合并视频
方法一:
lua
ffmpeg -f concat -i concat:"1.mp4|2.mp4" -c copy output.mp4
方法二:
使用文件入参,先创建一个 concat.txt
文件
lua
# 写入file 1.mp4file 2.mp4
ffmpeg -f concat -i concat.txt -c copy output.mp4
使用过滤器处理视频
提升输出速度,记得加入硬件加速。如:AMD集显:h264_amf ; N卡独显:h264_nvenc
- 实现多个视频剪辑、合并
- 裁剪视频比例
- 去除水印
- 去除马赛克
- .....等
一、去除水印
-
B站 1080 视频水印位置大概
x=1600:y=30:w=300:h=90
-
B站 720 视频水印位置
x=1068:y=16:w:200:h=70
-filter_complex "[0:v]delogo=x=1600:y=30:w=300:h=90"ffmpeg -i 'test.mp4' -filter_complex "[0:v]delogo=x=1600:y=30:w=300:h=90" output.mp4
二、去除马赛克
-filter:v
表示视频滤镜,minterpolate
表示使用 minterpolate 滤镜,mi_mode=mci
、mc_mode=aobmc
、mb_size=8
分别表示帧间插值算法、运动补偿算法和块大小
lua
# -filter_complex "[0:v]delogo=x=1600:y=30:w=300:h=90"
ffmpeg -i 'test.mp4' -filter_complex "[0:v]delogo=x=1600:y=30:w=300:h=90" output.mp4
三、添加转场
css
ffmpeg -i input_1.mp4 -i input_2.mp4 -filter_complex "xfade=transition=fade:duration=2:offset=2" output.mp4