ffmpeg常用指令
ffmpeg常用指令
ZHY很早就听说格式工厂偷偷拿用户的电脑挖矿,知道这件事后我不太信任它了,听说大部分音视频处理软件都是基于ffmpeg来封装功能,那我干脆研究一下ffmpeg的用法。
网上搜了一下找到一个博主的教程,这里我搬运一下,转载地址:
https://wklchris.github.io/blog/FFmpeg/FFmpeg.html
本篇主要展示我自己常用的内容。有用到再搬运,比如这次只用到了格式转换。
这是我将mkv
容器的猫和老鼠视频转换为mp4
容器的指令,
-c:v
:指定视频(video)的编码器h264_nvenc
:编码,这意思是gpu和cpu混合运算-c:a
:表示音频(audio)编码器。copy
:表示流复制,这样不需要重新编码。
ffmpeg -i 01.mkv -c:v h264_nvenc -c:a copy 01.mp4 |
将文件转换为mp4文件并且设置质量系数(-crf
或-cq
0-51越小质量越高)来降低文件大小
ffmpeg -i qixing.mp4 -c:v hevc_nvenc -preset medium -cq 18 -c:a copy output_hevc.mp4 |
-cq和-crf的区别是?哪种更好
在使用 ffmpeg
进行视频编码时,-cq
和 -crf
都是用来控制输出视频质量的参数,但它们应用于不同的编码器,并且有一些细微的区别。
-crf (Constant Rate Factor)
- 适用编码器:主要用于 x264(H.264)和 x265(HEVC/H.265)等软件编码器。
- 功能:CRF 是一种恒定质量模式下的设置,它允许你在编码时指定一个质量因子。数值越小,表示质量越高,文件也越大;数值越大,质量越低,文件也越小。
- 范围:对于 x264 和 x265,CRF 的典型范围是 0 到 51。默认值通常是 23,其中 18 被认为是视觉无损的质量水平。
- 优势:CRF 提供了一种很好的方式来平衡质量和文件大小,因为它会根据内容的复杂性自动调整比特率。
-cq (Constant Quality)
- 适用编码器:主要用于硬件加速编码器,如 NVIDIA 的 NVENC 或 Intel 的 QSV。
- 功能:CQ 与 CRF 类似,也是用来控制输出视频质量的一个质量因子。同样地,数值越高质量越低,文件也越小。
- 范围:具体范围可能依赖于使用的硬件编码器,但对于许多硬件加速方案来说,通常也是 0 到 51。
- 优势:CQ 在硬件加速编码中提供了类似 CRF 的质量控制机制,但它利用了硬件加速的优势,可以实现更快的编码速度。
哪种更好?
- 质量优先:如果你更关注最终视频的质量而不是编码速度,那么使用软件编码器配合
-crf
可能会提供更好的结果,因为软件编码器往往能够更精细地控制压缩过程。 - 速度优先:如果你需要快速完成编码工作,或者你的系统配备了强大的 GPU 并且支持硬件加速编码,那么使用
-cq
结合硬件加速编码器可能是更好的选择。这可以在保持可接受的质量的同时大幅提高编码效率。
总的来说,没有绝对的好坏之分,而是取决于你的具体需求——是对质量有更高要求还是对编码速度有更高要求。实践中,你可能需要尝试不同的设置来找到最适合你项目的平衡点。
以下搬运内容有更详细的讲解
在开始之前,先介绍一个全局参数 -hide_banner
;它可以阻止 FFmpeg 在每次执行时开头打印的那一堆版本信息文本。例如,在展示 FFmpeg 的许可证时,隐藏这部分默认打印的版本信息:
ffmpeg -hide_banner -L |
格式转换
这毫无疑问是最常使用的功能。关于各种常用的视频/音频编码格式或编码器,请参考 常用的编码格式 一节的内容。
转码
比如将一个 FLV 文件转为 MP4 文件并重编码,FFmpeg 会自动寻找编解码器:
ffmpeg -i video.flv video.mp4 |
其中,在 -i
后指定输入文件的文件名,在所有命令的最后指定输出文件的文件名。 如果文件名带有空格,请用双引号将文件名包裹。 上述的 video.mp4
在 -i
参数之后,称为 输出参数 ;反之,在 -i
之前的称为 输入参数。
转码过程可能较慢。关于快速地进行格式转换,请参阅下文 流复制一节的内容。
用户也可以显式地指定编码器,比如使用 h.264 视频编码器与 flac 音频编码器。
ffmpeg -i video.flv -c:v libx264 -c:a flac video.mkv |
其中 -c
是 -codec
的简写。用 v
表示视频(video)编码器、 a
表示音频(audio)编码器。
流复制
格式转换还有一种快速的情形。如果两者的所有流都不改动且输出容器支持输入的所有流,那么可以直接向 -c
传递 copy
以进行流复制。这样省去了重新编码的时间,格式转换将十分迅速:
ffmpeg -i video.avi -c copy video.mp4 |
其中,-c
是 codec 的简称,表示所有流的编解码器。该命令表示所有流均不进行额外操作,直接复制到新容器中。
提取流(音频、字幕)
有时需要指定流来完成格式转换,比如将一个 MP4 视频文件转为 AAC 音频文件(此处实质上是直接提取):
ffmpeg -i video.mp4 -c:a copy audio.aac |
此处的 -c:a
表示音频流;视频流 -c:v
与字幕流 -c:s
自然也类似。
注意:如果音频流与容器冲突时,你需要将 copy
改为正确的编解码器(或者删去 -c:a copy
来让 FFmpeg 自动选择),以执行重编码。
也可以在提取流的时候进行转码:(-q
表示质量,数字越小质量越高)
ffmpeg -i video.mkv -c:a libmp3lame -q:a 2 audio.mp3 |
对于内挂了字幕的视频文件,也可以将其字幕单独提取出来,例如:
ffmpeg -i video.mkv -c:s copy subtitle.srt |