- FFmpeg处理音视频流程(记住)
- 输入文件 --demuxer(解复用)--> 编码数据包 --decoder--> 解码后的数据帧 --encoder--> 编码数据包 --muxer(复用)--> 输出文件
- FFmpeg命令分类
- 基本信息查询命令
- 录制命令
- 分解/复用命令
- 处理原始数据命令
- 裁剪与合并命令
- 图片视频互转命令
- 直播相关命令
- 各种滤镜命令
- 基本信息查询命令15个
-version 显示版本。 -formats 显示可用的格式(包括设备)。 -demuxers 显示可用的demuxers。 -muxers 显示可用的muxers。 -devices 显示可用的设备。 -codecs 显示libavcodec已知的所有编解码器。 -decoders 显示可用的解码器。 -encoders 显示所有可用的编码器。 -bsfs 显示可用的比特流filter。 -protocols 显示可用的协议。 -filters 显示可用的libavfilter过滤器。 -pix_fmts 显示可用的像素格式。 -sample_fmts 显示可用的采样格式。 -layouts 显示channel名称和标准channel布局。 -colors 显示识别的颜色名称。
4.录制命令
- ffmpeg录制视频
```
1. ffmpeg -f avfoundation -i 1 -r 30 out.yuv
-f 指定使用avfoundation库采集数据
-i 指定从哪采集数据,1代表视频数据来自屏幕,0代表视频数据来自摄像头
-r 指定帧率
out.yuv 采集后的视频数据保存成为yuv数据,yuv是一种原始视频数据,没有任何的压缩
ctrl + c 结束,在命令行下起着终止当前执行程序的作用
2. ffplay -s 2880x1800 -pix_fmt uyvy422 out.yuv
-s 指定录制时分辨率/尺寸大小
-pix_fmt 指定录制时像素格式,以正确渲染
使用ffplay播放刚录的视频
3. ffmpeg -f avfoundation -list_devices true -i ""
查询avfoundation库所支持的设备列表,音频代表的数字放在:后面
```
- ffmpeg录制声音
```
1. ffmpeg -f avfoundation -i :0 out.wav
-f 指定使用avfoundation库采集数据
-i 指定从哪采集数据 :0代表音屏设备,数字放在:后面代表音屏数据(不一定正确,关键 通过ffmpeg -f avfoundation -list_devices true -i "" 查看各个数值代表的含义)
out.yuv 采集后的音屏数据保存成为wav数据
```
- 分解/复用命令:文件格式的转换
- 流程 输入文件 --demuxer(解复用)--> 编码数据包 --muxer(复用)--> 输出文件
- 多媒体格式的转换
1. ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv -i 输入文件 -vcodec 视频编解码处理方式是copy -acodec 音频编解码同上 out.flv 输出为flv,其中out是视频名称可改 2. 抽取视频,不包含声音 ffmpeg -i out.mp4 -vcodec copy -an out.h264 // -an a代表audio n代表no 输出结果不包括视频 ffplay out.h264 3. 抽取音频,不包含视频 ffmpeg -i out.mp4 -vn -acodec copy out.aac ffplay out.aac
- 处理原始数据命令
- 原始数据是指ffmpeg解码后的数据,对于视频就是yuv数据,对于音频就是pcm数据.
- 通过ffmpeg提取yuv数据
1. ffmpeg -i out.mp4 -an -c:v rawvideo -pixel_fmts yuv420p out.yuv -i 输入文件 -an a代表audio n代表no 输出结果不包括视频 -c:v 对视频进行编码,使用rawvideo原始视频进行编码 -pix_fmt 指定像素格式yuv420p 2. ffplay -s 1336x752 out.yuv 原始数据没有宽和高,播放器无法正确解析,需要指定原始视频的分辨率 -s 1336x752 分辨率在ffmpeg提取yuv视频时已显示出来过
- 通过ffmpeg提取pcm数据
1. ffmpeg -i out.mp4 -vn -ar 44110 -ac 2 -f s16le out.pcm -vn 不需要视频 -ar a代表audio r代表read,音频的采样率是44.1k -ac a代表audio c代表channel,2代表声音是双声道 -f 音频pcm数据其数据存储格式是s16le out.pcm 输出的文件名 2. ffplay -ar 44110 -ac 2 -f s16le out.pcm 需要告知ffplay播放
- 各种滤镜命令
- 视频加水印,去水印,画中画,视频的裁剪,音频倍速等可使用滤镜实现
- ffmpeg滤镜处理流程
解码后的数据帧-filter->过滤后的数据帧-encoder-> 编码数据包 - FFmpeg处理音视频流程(和滤镜流程对照理解 )
输入文件 --demuxer(解复用)--> 编码数据包 --decoder--> 解码后的数据帧 --encoder--> 编码数据包 --muxer(复用)--> 输出文件 - 滤镜命令:视屏裁剪命令(视频画面大小裁剪不是播放过程中裁剪)
1. ffmpeg -i out.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out2.mp -i 指定多媒体文件 -vf 视屏滤镜,crop代表一种滤镜名字,后面跟上参数,in_w-200表示本身视频宽度减去200,in_h-200表示本身视频高度减去200 -c:v libx264 告诉ffmpeg此视频的编码器是libx264 -c:a copy 不对音频做特殊处理 out.mp4 输出文件
- 裁剪与合并命令
- ffmpeg音视频裁剪
1. ffmpeg -i in.mp4 -ss 00:00:00 -t 10 -ss 视频裁剪的起始时间 -t 10 裁剪多长时间,单位s,10s out.ts 输出文件
- 图片视频互转命令
- 直播相关命令
- 直播推流
1. ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamname -re 减慢帧率速度,让帧率与视频真正帧率保持同步 -i out.mp4 需要推出去的文件 -c 音视频编解码,copy音频与视频的参数不变;如果专门指定音频那就是-acodec,如果专门指定视频那就是-vcodec -f flv 推出去的文件格式是flv rtmp://server/live/streamname 服务器地址,将视频推送到rtmp服务器上,其他端就可以从rtmp服务器上拉流看到直播影像
- 直播拉流
1. ffmpeg -i rtmp://server/live/streamname -c copy dump.flv 实例 ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 -c copy dump.m3u8 (拉取什么格式就保存成什么格式) ffplay dump.m3u8 -c copy 对于拉到的数据流不做重新编码,不对音视频参数做任何处理 dump.flv 拉取到本地后保存成 dump.flv 文件