FFmpeg 视频处理工具快速入门上手

以下理论部分,实践和命令直接看 命令实践

关于视频处理的重要概念​

  • 编解码:分软件和硬件
  • 硬件加速:支持英特尔、英伟达、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 or hd720hd1080
  • 帧率:-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

  1. 实现多个视频剪辑、合并
  2. 裁剪视频比例
  3. 去除水印
  4. 去除马赛克
  5. .....等

一、去除水印​

  • 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=mcimc_mode=aobmcmb_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

参考资料​

  1. 如何使用FFmpeg从视频中删除多个片段
  2. 给新手的 20 多个 FFmpeg 命令示例 - 知乎
  3. FFMPEG 使用显卡加速转码 - 掘金
  4. FFmpeg 硬件加速介绍 - 简书
相关推荐
mixboot2 天前
macOS sw_vers 查看当前系统版本
macos·命令行·系统版本
岁岁岁平安12 天前
mysql上课总结(4)(MySQL中数据库的备份与还原(命令行或DataGrip中直接操作))
数据库·mysql·mysqldump·命令行·数据库的备份与还原·.exe
岁岁岁平安15 天前
mysql上课总结(2)(DCL的所有操作总结、命令行快速启动/关闭mysql服务)
数据库·mysql·命令行·权限·dcl·localhost
栩栩云生1 个月前
📦 x-cmd pkg | hexyl - 终端中的彩色十六进制查看器,轻松解析二进制文件
运维·rust·命令行
鸿·蒙1 个月前
Linux 命令行
linux·命令行
x-cmd1 个月前
x-cmd pkg | carbonyl - 终端图形浏览器,浏览像素版网页
运维·性能优化·rust·嵌入式·终端·浏览器·命令行
rocksun1 个月前
我最喜欢的5个命令行工具
命令行
代吗喽1 个月前
Macos终端常用的命令行指令总结
macos·命令行
栩栩云生1 个月前
📦 x-cmd pkg | rg - 文本搜索工具,grep 命令的现代化替代品
运维·rust·命令行
x-cmd2 个月前
x-cmd pkg | tokei - 代码统计利器,助你快速了解项目进度
linux·rust·项目管理·命令行·yml·代码统计·项目进度