FFmpeg常用命令分类:
- 基本信息查询
- 录制
- 分解/复用
- 裁剪与合并
- 图片/视频互转
- 直播
- 处理原始数据
- 滤镜
一. 基本信息查询命令
二. 录制命令
FFmpeg录屏命令:
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
-f avfoundation: 指定使用avfoundation采集数据
-i: 指定从哪儿采集数据,它是一个文件索引号,1代表是从屏幕采集
-r: 指定帧率
out.yuv表示以yuv格式输出
所以,上面的指令意思是:使用avfoundation以每秒30的帧率从屏幕采集视频。
输入上面指令后,就开始录制了,可以使用ctrl+c取消录制,再通过以下指令播放录制的视频:
ffplay out.yuv
结果报错:
Picture size 0x0 is invalid
out.yuv: Invalid argument
这是因为yuv原始数据没有宽高,要指定分辨率,从录制日志中可以查到:
所以播放指令变成:
ffplay -s 4096x2304 out.yuv
但是播放时出现了以下花屏的情况:
这是因为ffplay默认使用的像素格式是yuv420p:
而我们录制屏幕采用的像素格式是uyvy422:
像素格式不一致导致了无法正确渲染,所以需要另外指定录制时的像素格式。
ffplay -s 4096x2304 -pix_fmt uyvy422 out.yuv
指令输入后就能正常播放刚刚录制的屏幕视频了。
上面说了i是设备索引号,1代表的是从屏幕采集,实际上我们可以通过命令去列出设备索引号:
ffmpeg -f avfoundation -list_devices true -I ""
上面列出了我的电脑上的视频设备和音频设备,前面的数字就是索引号。可以看到视频、音频索引号都有0、1,那怎么区分呢,也很简单,录制音频指令,索引号放到冒号后边,如下:
ffmpeg -f avfoundation -i :0 out.wav
:0就代表音频设备:Built-in Microphone内置麦克风
录制结束也是ctrl+c。再通过以下指令来播放刚刚录制的音频:
ffplay out.wav
这样音频的录制与播放就完成了。
三. 分解与复用命令
FFmpeg分解与复用主要是文件格式的转换,以及分解出音频、视频文件等等。
- 比如,多媒体格式转换,将一个mp4文件转成flv格式:
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
-i out.mp4:输入一个名叫out的mp4文件。
-vcodec copy:视频编码处理方式。
-acodec copy:音频编码处理方式。
- 单独抽取音频流或视频流。
如果只是想抽取视频流,可以用以下命令:
ffmpeg -i out.mp4 -an -vcodec copy out.h264
-an:不要音频。
同理,只抽取音频流:
ffmpeg -i out.mp4 -acodec copy -vn out.aac
四. 处理原始数据命令
所谓原始数据,就是FFmpeg解码后的数据。
- 提取视频原始数据。
ffmpeg -i out.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
-c:v:对视频进行编码。
rawvideo:编码格式按原来的格式。
pix_fmt yuv420p:像素格式是yuv420p。
note: 播放yuv格式的视频,要指定分辨率,如
ffplay -s 4096x2304 out.yuv
- 提取音频PCM原始数据。
ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
-ar:音频采样率,常用的有48k、32k、16k等等。
-ac:音频声道,包括单声道、双声道、立体声、环绕立体声等等,上面-ac2是双声道。
-f s16le: 存储格式,s16是有符号16位来表示每个数值,le是little,它是一种存储方式。
然后播放提取的音频:
ffplay out.pcm
发现报错:
这是因为播放pcm原始音频数据并不知道采样率、声道这些信息,所以需要直接指定:
ffplay -ar 44100 -ac 2 -f s16le out.pcm
五. 滤镜命令
滤镜处理,比如加水印、去水印、画中画、视频裁剪、音频倍速等等,都可以通过滤镜命令实现。
滤镜处理是对解码后的原始数据帧进行处理,那解码后的数据如何得到呢,这就要先了解FFmpeg对音视频文件处理的流程:
- 输入文件是一些具有封装格式的文件,经过demuxer分解解封装后,就得到了音频、视频等编码压缩数据。
- 将这些编码数据包进行解码decoder,解码后就得到原始数据帧。
- 再将解码后数据帧编码压缩成我们想要的大小,比如调整分辨率,720缩小变成480P的。
- 重新muxer封装编码后的数据包成流行的格式并输出播放。
上面流程是一个完整的流程,其中得到的解码数据,如果进行滤镜处理,就要再经过下面的流程:
解码后数据帧,经过滤镜程序过滤filter,得到过滤后的数据帧,再重新编码。
- 视频画面大小裁剪
ffmpeg -i water.mp4 -vf crop=in_w-300:in_h-150 -c:v libx264 -c:a copy out.mp4
-vf: 视频滤镜类型,-af就是音频滤镜类型。
crop=in_w-300:in_h-150:crop是滤镜名,等号后跟的是参数,本身视频的宽高上减去一定的值。
-c:v libx264:视频编码器是libx264。
-c:a copy:音频编码器是copy原来的,不作特殊处理。
note: 要先cd到原视频文件的目录下,再执行上面的命令。
六. 裁剪与合并命令
- 时长裁剪
ffmpeg -i water.mp4 -ss 00:00:00 -t 5 out.ts
-ss:裁剪起始时间
-t:总时长
- 多个视频片段进行合并
ffmpeg -f concat -i myInputsFile.txt out.mp4
-f concat:合并指令。
-i myInputsFile.txt:这里的myInputsFile.txt中存放的是多媒体文件列表,该txt文件中内容的格式是file filename
,如下:
out.ts和out1.ts是本地两个视频文件,当然在合并时,要cd到当前要合并的视频文件目录下。
当然其他视频格式也可以合并,比如将两个mp4格式的视频合并,只需将文件名以上面的格式放到txt文件中即可。
七. 图片与视频互转命令
- 视频转图片
ffmpeg -i water.mp4 -r 1 -f image2 image-%3d.jpeg
-r:帧率,上面是以每秒1帧转出图片。
-f:转出格式,上面是image格式的,image2就是该格式的第二版。
image-%3d.jpeg:输出文件名,前缀是image,在加上3个数字的文件名。
- 图片转视频
ffmpeg -i image-%3d.jpeg imageVideo.mp4
将上面前缀为image的一组图片转成视频。
八. 直播推拉流命令
- 直播推流
ffmpeg -re -i water.mp4 -c copy -f flv rtmp://server/live/streamName
-re: 减慢帧率速度,本地音视频文件是以尽可能快的速度进行播放,加上re是为了让直播流尽可能与真实的帧率保持一致。
-c: 编解码方式,-ac是音频,-vc是视频。上面是copy,不作处理。
-f flv:推出文件格式。
rtmp://server/live/streamName:服务器地址。
- 直播拉流
ffmpeg -i rtmp://server/live/streamName -c copy myLive.flv
现在应用实战一下,比如我们先从湖南卫视直播源rtmp://58.200.131.2:1935/livetv/hunantv
拉流,并保存到本地。
ffmpeg -i rtmp://58.200.131.2:1935/livetv/hunantv -c copy hunanTV.flv
ctrl + c,取消拉流保存到本地,现在播放一下保存的hunanTV.flv视频文件是可以播放的。
当然,也可以拉其他协议的视频流,下面是一些视频流的地址,可以换到上面试一下。
RTSP协议直播源
- 大熊兔(点播):rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov
HTTP协议直播源
- CCTV1高清:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
- CCTV3高清:http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8
比如拉取CCTV3高清:
ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8 -c copy cctv3.m3u8
note:注意保存格式,拉取的是m3u8格式,所以存的也要是m3u8格式的。