FFMPEG下载编译与安装
- git clone https://git.ffmpeg.org/ffmpeg.git
- configure --help (查看ffmpeg指令的查看)
- make && make install
FFmpeg命令分类
1. 基本信息查询命令
2. 录制命令
3. 分解复用命令
4. 处理原始数据命令
5. 裁剪与合并命令
6. 图片与视频的转换
7. 直播相关命令
8. 各种滤镜命令
FFmpeg处理流程
输入文件 =(解包)=> 编码数据包 =(编码)=> 解码后数据帧 =(编码)=> 编码数据包 =(打包)=> 输出文件
1. 基本信息查询命令
常用的查询命令有如下15个
命令 | 作用 |
---|---|
-version | 显示版本 |
-format | 显示可用的格式 |
-demuxers | 显示可用的demuxers |
-protocols | 显示可用的协议 |
-muxers | 显示可用的muxers |
-filters | 显示可用的过滤器 |
-devices | 显示可用的设备 |
-pix_fmts | 显示可用的像素格式 |
-codecs | 显示所有编解码器 |
-sample_fmts | 显示可用的采样格式 |
-decoders | 显示可用的解码器 |
-layouts | 显示channel名称 |
-encoders | 显示所有的编码器 |
-colors | 显示是别的颜色名称 |
-bsfs | 显示比特流filter |
2. 录制命令
2.1 FFmpeg录制屏幕
- ffmpeg -f avfoundation -i 1 -r 30 out.yuv
-f : 指定使用avfoundation采集数据
-i : 指定从哪儿采集数据(输入源),参数是一个设备
索引号(1.表示输入源是屏幕)
-r:指定帧率(rate,帧)。
按ffmpeg官方文档说-r与-framerate作用相同,但实际测试时发现不同。-framerate 用于限制输入,而-r用于限制输出。
.yuv 原始数据
注意,桌面的输入对帧率没有要求,所以不用限制桌面的帧率。其实限制了也没用。
2.1 查询设备索引号
-
ffmpeg -f avfoundation -list_devices true -i ""
2.2 FFmpeg录音命令
- ffmpeg -f avfoundation -i :0 out.wav
:0 表示使用麦克风设备,表示音频设备前面要加冒号
2.3 FFmpeg录视频
- ffmpeg -framerate 30 -f avfoundation -i 0 video.mp4
-framerate 上面已经解释过了,是限制输入的比特率的
此外还有:
-video_size用来限制视频尺寸,如 1280x720
3. 分解与复用
流拷贝是通过将 copy 参数提供给-codec选项来选择流的模式。它使得ffmpeg省略了指定流的解码和编码步骤,所以它只能进行多路分解和多路复用。 这对于更改容器格式或修改容器级元数据很有用。
3.1 多媒体格式的转换
- ffmpeg -i f35.mov -c:v copy -c:a copy f35.flv
-i:输入文件
-c:v(-vcodec) copy: 视频编码处理方式
-c:a(-acodec) copy: 音频编码处理方式
copy 指明只拷贝,不做编解码
3.1.1 抽取视频
- ffmpeg -i f35.mov -vcodec copy -an f35.h264
an: a 代表音频,n 代表 no 也就是无音频的意思。
3.1.2 抽取音频
- ffmpeg -i f35.mov -acodec copy -vn f35.aac
vn: v 代表视频,n 代表 no 也就是无视频的意思。
4. 处理原始数据命令
4.1 FFmpeg提取YUV数据
- ffmpeg -i f35.mov -an -c:v rawvideo -pix_fmt yuv420p f35.yuv
-i: 输入的源
-an: 不包含音频
-c:v rawvideo 对视频编码处理成rawvideo格式
-pix_fmt yuv420p 像素格式设置成yuv 4:2:0(最常用的像素格式类型)
4.2 FFmpeg提取PCM数据
- ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
-ar:音频采样率 rate
-ac:声道的数量
-f:数据存储格式
s16le:一种数据存储方式 - ffplay -ar 44100 -ac 2 -f s16le f35.pcm
播放的时候,我们也需要带上采样率,声道数量以及数据存储格式这些参数来告诉ffplay如何去播放pcm文件
5. 滤镜命令
先看一下FFmpeg滤镜的流程:
5.1 视频裁剪
- ffmpeg -i f36.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy f36_out.mp4
-vf: 表示视频滤镜
crop: 滤镜的类型,裁剪
in_w: 输入视频的宽度
in_h: 输入视频的高度
还有很多有意思的滤镜,可以看一下FFMPEG 入门这篇文章里面举的例子
6. FFmpeg音视频裁剪
6.1 裁剪
- ffmpeg -i f36.mp4 -ss 00:00:10 -t 6 f36_crop_10.mp4
-ss 表示音视频从哪个时间开始裁剪
-t 表示裁剪时长
6.2 合并
- ffmpeg -f concat -i inputs.txt out.flv
-f concat : 告诉ffmpeg要对后面的文件进行拼接
-i inputs.txt: i 表示输入源, inputs.txt里面存储着要拼接的文件列表
inputs.txt 内容是 ‘file filename’ 格式的,如:
file 'f36_crop_10.ts'
file 'f36_crop_6.ts'
注意,这里合并的两个文件需要是ts格式的,入过不是ts格式的文件,合并的时候就会出现一些奇奇怪怪的问题。原因后面再研究。
7. 图片/视频互转命令
7.1 视频转图片
- ffmpeg -i f35.mov -r 1 -f image2 ./images/image-%3d.jpeg
-i 指定的输入文件
-r 转换图片的帧率,即:每秒转换出多少张图片
-f 告诉ffmpeg:要将输出的文件转换成什么格式,如:image2
7.2 图片转视频
- ffmpeg -i image-%3d.png images.mp4
这样转出的视频速度会非常快,因为视频是30fps的,而图片裁剪为1fps,这样我们的到的图片数量很少,得到的视频也会播放的相当快
8. 直播推/拉流
8.1 直播推流
- ffmpeg -re -i f35.mov -c copy -f flv rtmp://server/live/streamName
-c 音视频编解码,-a 音频, -c 视频
-re 减慢帧率速度, 让帧率与真正的帧率保持同步
8.2 拉流保存
- ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
8.3 转流
- ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream
8.4 实时推流
- ffmpeg -framerate 15 -f avfoundation -i "1" -s 1280x720 -c:v libx264 -f flv rtmp://localhost:1935/live/room