FFmpeg 的基本使用

发表在 教程 共有 0 条评论

介绍

FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的——百科抄的

FFmpeg 项目创建者:法布里斯·贝拉 (Fabrice Bellard),法国著名程序员,超牛的(语言匮乏,更多他的牛逼事迹请自行搜索)

组件

FFmpeg 项目由以下几部分组成:

FFmpeg 视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件
ffserver 基于HTTP、RTSP用于实时广播的多媒体服务器
ffplay 用SDL和FFmpeg库开发的一个简单的媒体播放器
libavcodec 包含了所有FFmpeg音视频编解码器的库
libavformat 包含了所有的普通音视格式的解析器和产生器的库

容器

视频文件本身其实是一个容器 (container),里面包括了视频、音频、字幕、章节等内容

一般来说,视频文件的后缀名反映了它的容器格式,常见的容器格式有以下几种:

MP4
MKV
AVI
WebM

查看 FFmpeg 支持的容器

ffmpeg -formats

编码器

编码器 (encoders) 是实现某种编码格式的库文件,只有安装了某种格式的编码器,才能实现该格式视频/音频的编码和解码

以下是一些 FFmpeg 内置的视频编码器。

libx264:最流行的开源 H.264 编码器
NVENC:基于 NVIDIA GPU 的 H.264 编码器
libx265:开源的 HEVC 编码器
libvpx:谷歌的 VP8 和 VP9 编码器
libaom:AV1 编码器

音频编码器如下。

libfdk-aac
aac

查看 FFmpeg 已安装的编码器

ffmpeg -encoders

基本命令

FFmpeg 的参数非常多,大致可以分成五个部分

ffmpeg {1} {2} -i {3} {4} {5}

1.全局参数
2.输入文件参数
3.输入文件
4.输出文件参数
5.输出文件

为了便于查看,可以使用 \ 转义

ffmpeg \
[全局参数] \
[输入文件参数] \
-i [输入文件] \
[输出文件参数] \
[输出文件]

常用参数

-c:指定编码器
-c copy:直接复制,不经过重新编码
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn:去除视频流
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
-y:不经过确认,输出时直接覆盖同名文件

如:

ffmpeg \
-y \ #全局参数 ( -y 直接覆盖同名文件)
-c:a libfdk_aac -c:v libx264 \ # 输入文件参数 ( -c:a 指定音频编码器;-c:v 指定视频编码器)
-i filename.mp4 \ # 输入的文件
-c:v libvpx-vp9 -c:a libvorbis \ # 输出文件参数
newfilename.webm # 输出的文件

以上命令将 filename.mp4 文件 (音频编码格式 AAC,视频编码格式 H264) 转换成 (视频编码格式 VP9,音频格式 Vorbis) 并输出到 newfilename.webm 保存

FFmpeg 会判断输入文件的编码,所以以上命令可以简写为:

ffmpeg \
-y \
-i filename.mp4 \
-c:v libvpx-vp9 -c:a libvorbis \
newfilename.webm

常用命令

将视频转成 H265:

#转出来的视频质量基本一样,容量会小30%左右
ffmpeg -i input.mp4 -c:v libx265 output.mp4

转换容器格式

#不经过转码,编码格式不变
ffmpeg -i input.mp4 -c copy output.mkv

降低/调整码率

一般用来将视频文件的体积变小,画质相对的降低

#假设input.mp4码率是10Mbps(一般也只将原视频码率降得比原来的低,提高到比原来的高没有意义)
#压缩到5000-6000左右,缓冲区设为5500K
ffmpeg \
-i input.mp4 \
-minrate 5000K -maxrate 6000K -bufsize 5500K \
output.mp4

改变分辨率

#分辨率改为480p
ffmpeg \
-i input.mp4 \
-vf scale=480:-1 \
output.mp4

截图

# -vframes 1 只截取1帧;-q:v 1 图片质量(一般是1-5之间 1最高质量)
ffmpeg -ss 00:10:40 -i 2.mp4 -vframes 1 -q:v 1 output2.jpg

裁剪

#从00:01:00起截取10秒
ffmpeg -ss 00:01:00 -i input.mp4 -t 10 -c copy output.mp4
ffmpeg -ss 00:01:00 -t 00:00:10 -i input.mp4 -c copy output.mp4

提取音频

#直接提取视频的音频
ffmpeg -i input.mp4 -c:a copy -vn output.aac
#转码成MP3
ffmpeg -i input.mp4 -c:a mp3 -vn output.mp3

提取视频

#直接提取视频
ffmpeg -i input.mp4 -c:v copy -an output.mp4

总结

常用的大概就是这些命令吧,自己也是刚刚接触 FFmpeg 的,稍微做了些记录,还需要慢慢摸索;如果只是想简单的转视频,可以用 HandBrakeShanaEncoder 或者简单的格式工厂也行,这些工具也基本是基于 FFmpeg 做个壳的,很多播放器也是基于它,还有很多使用了 FFmpeg 相关代码的软件不遵守 LGPL/GPL 协议被挂在了 FFmpeg 耻辱柱(HallOfShame)上,比如:暴风影音、QQ影音、PotPlayer、KMPlayer等

FFmpeg 的官网:地址

FFmpeg 的Github项目:地址

FFmpeg 的官方文档在这,可以自行去探索更多的功能,地址:官方文档

评论已关闭