介绍
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 的,稍微做了些记录,还需要慢慢摸索;如果只是想简单的转视频,可以用 HandBrake
、ShanaEncoder
或者简单的格式工厂也行,这些工具也基本是基于 FFmpeg 做个壳的,很多播放器也是基于它,还有很多使用了 FFmpeg 相关代码的软件不遵守 LGPL/GPL 协议被挂在了 FFmpeg 耻辱柱(HallOfShame)上,比如:暴风影音、QQ影音、PotPlayer、KMPlayer等
FFmpeg 的官网:地址
FFmpeg 的Github项目:地址
FFmpeg 的官方文档在这,可以自行去探索更多的功能,地址:官方文档
本文由 Ainto 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2020-05-13 23:36