基本信息查询命令
录制命令
分解/复用命令(对不同文件格式的转化)
处理原始数据命令
裁剪与合并命令
图片/视频互转命令
直播相关命令(推流)
各种滤镜命令
FFmpeg 处理音视频基本流程
很重要!!!
1、基本信息查询命令
2、录制命令
录制屏幕
录制屏幕:
1 | ffmpeg -f avfoundation -i 1 -r 30 out.yuv |
-f: 是指使用 Mac 下的 avfoundation 库采集数据
avfoundation 是 Mac 下专门用于采集处理的
-i: 指的是输入是什么,1 代表的是屏幕设备的索引值,类似于文件描述符,摄像头是 0
-r: 指定帧率
播放录制
注意如果是 yuv 视频,必须是告诉 ffplay 宽高和帧率才可以播放。
参数是开始录制时 ffmpeg 的提示
1 | ffplay -s 3360x2100 -pix_fmt uyvy422 out.yuv |
-s 是分辨率
查询 avfoundation 所支持的设备列表:
1 | ffmpeg -f avfoundation -list_devices true -i "" |
录制声音
1 | ffmpeg -f avfoundation -i :0 out.wav |
:0 代表音频设备
播放录音:
1 | ffplay out.wav |
3、分解/复用命令
多媒体格式转换
处理方式为 copy,不改变编解码,原来是双声道拷贝过去还是双声道,aac 还是 aac:
1 | ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv |
-i:输入文件
-vcodec copy:视频编码处理方式
-acodec copy:音频编码处理方式
直接抽取视频:
1 | ffmpeg -i out.mov -an -vcodec copy out.h264 |
-an:表示 -audio none
直接抽取音频:
1 | ffmpeg -i out.mov -vn -acodec copy out.aac |
4、处理原始数据命令
原始数据就是 ffmpeg 解码后的数据
对于视频就是 yuv 数据
对于音频就是 pcm 数据
提取 yuv 数据
1 | ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv |
-an 表示不带音频数据
-c:v 表示对视频进行编码,使用 rawvideo 编码
-pix_fmt 原始数据必须制定像素格式,yuv 4:2:0,是常用的像素格式
提取 PCM 数据
1 | ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm |
-vn 表示不要视频数据
-ar a表示audio r表示rate 音频采样率为 44100,44.1k
常用的采样率还有:48k 32k 16k
-ac2 audio channel 2 表示双声道
立体声就是3,还有环绕立体声
-f 表示抽取音频数据存储格式是 s15le s表示有符号,16表示每一个数值用16位表示 le 表示小头(小端?)
注意播放音频的时候还是一样,原始数据需要指定相关的采样率、声道数等才能播放
1 | ffplay -ar 44100 -ac 2 -f s16le out.pcm |
5、滤镜命令
加减水印、画中画、裁剪等。
解码后的数据帧 -> 滤镜 -> 重新编码
滤镜命令
1 | ffmpeg -i out.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4 |
-vf 视频滤镜 crop
后面是 crop 滤镜的参数
in_w 视频宽度-200
in_h 视频高度-200
-c:v 视频编码器 libx264
-c:a copy 不对音频做处理
视频添加图片/文字水印
https://www.jianshu.com/p/c0e151775075
添加图片水印:
1 | ffmpeg -i shanqiu.mp4 -vf "movie=DB24ED44963ED81BA24EAD243F006DCE.JPG[watermark];[in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10[out]" shuiyin.mp4 |
在视频右下角的添加图片水印:
1 | ffmpeg -i input.mp4 -i logo.png -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' output.mp4 |
在视频左下角添加图片水印:
1 | ffmpeg -i input.mp4 -i logo.png -filter_complex 'overlay=x=10:y=main_h-overlay_h-10' output.mp4 |
6、裁剪与合并命令
裁剪
1 | ffmpeg -i in.mp4 -ss 00:00:00 -t 10 out.mp4 |
从 00:00:00 起始裁剪 10 秒,输出到 out.mp4
合并
1 | ffmpeg -f concat -i inputs.txt out.flv |
-f concat 拼接
-i 后的参数是需要拼接的文件列表 inputs.txt 记录的是所有要拼接的视频列表
inputs.txt 里的内容为:
file 'filename.mp4'
格式
如:
1 | file '1.mp4' |
7、图片/视频互转命令
视频转图片:
1 | ffmpeg -i in.flv -r 1 -f image2 image-%3d.jpeg |
-r 每秒钟转换帧率
-f 表示将输入文件转成什么格式的 image2 表示一种图片格式
-%3d 表示由3个数字组成
图片转视频:
1 | ffmpeg -i image-%3d.jpeg out.mp4 |
8、直播相关命令
直播推/拉流
直播推流:
1 | ffmpeg -re -i shanqiu.mp4 -c copy -f flv rtmp://server/live/streamName |
-re 减慢帧率速度,对于直播流来说让帧率与真正的帧率保持同步
-i 多媒体文件
-c 音视频编解码(音频 -a 视频 -v) copy
-f 指定推出去的文件格式 flv
后面是服务器地址
其他的端再从 rtmp 服务器上拉流就可以看到影像了。
直播拉流:
1 | ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 -c copy a.m3u8 |
直接可以用 ffplay 看:
1 | ffplay http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8 |
推流方法:
自己搭建 NGINX 服务器,然后推流上去
bilibili 上推流
EOF