前言:
作者简介:小曾同学.com,小伙伴们也可以叫我小曾,一个致力于测试开发的博主⛽️
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!
之前给小伙伴们分享了在Mac中安装FFMPEG,今天主要给大家整理了下在音视频测试
中经常使用的FFMPEG
相关命令。
FFmpeg
是一款音视频编解码
工具,也是一组音视频编解码开发套件,为开发者提供了丰富的音视频处理调用接口。
FFmpeg
源代码编译后会生成几个可执行程序,分别是ffmpeg
、ffplay
、ffprobe
,这三个也称为 FFmpeg 三剑客
,各有各的作用,接下来就给大家一一介绍。
ffmpeg
主要是多媒体的编解码工具,具体功能主要包括视频裁剪,去除水印,添加 logo,提取封面,提取音频,提取视频等功能。
ffmpeg的主要工作流程相对比较简单,介绍如下,
1)解封装(Demuxing)
2)解码(Decoding)
3)编码(Encoding)
4)封装(Muxing)
其中需要经过六个步骤,具体如下,
1)读取输入源
2)进行音视频的解封装
3)解码每一帧音视频数据
4)编码每一帧音视频数据
5)进行音视频的重新封装
6)输出到目标
ffmpeg 整体处理的工作流程与步骤如图所示,
从工作流程可以看出,ffmpeg 首先读取输入源,然后通过Demuxer
将音视频包进行解封装,再通过Decoder
进行解码,将音视频通过Decoder解码
成为 YUV
或者PCM
数据,然后通过Encoder
将对应的数据进行编码,将编码后的音视频数据包通过Muxer
进行封装,最终输出为输出流。
录制命令
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
# -f:指定使用Mac下的avfoundation来采集数据。
# -i:指定从哪采集的数据,
# 1代表的是文件索引值(0:摄像头)
# -r:表示帧率
# 采集的数据 是原始数据,没有经过压缩
# 或者输入命令
ffmpeg -f avfoundation -pixel_format uyvy422 -i "1" -f flv pingmu.flv
ffmpeg -f avfoundation -i :0 out.wav
# :0代表音频设备
# 或者
ffmpeg -f avfoundation -i ":0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv maikefeng.flv
ffmpeg -f avfoundation -framerate 30 -video_size 1280x720 -i "0:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv "rtmp:xxxx推流地址"
分解/复用命令
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
# copy:针对音视频编解码方式不做改变
# -i:输入文件
# -vcodec:视频编解码方式
# -acodec:音频编解码方式
ffmpeg -i out.mp4 -an -vcodec copy out.h264
ffmpeg -i out.mp4 -vn -acodec copy out.aac
处理原始数据命令
原始数据:就是ffmpeg解码后的数据,pcm、yuv格式的数据
例如 提取PCM数据:
ffmpeg -i out.mp4 -vn -ar 44100 -ac2 -f s16le out1212.pcm
# -ar 表示音频采样率
# -ac2表示双声道
# -f s16le:音频数据存储格式,s代表有符号的
裁剪与合并命令
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out.ts
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out1.mp4
# 十分秒
# -t裁剪后视频的时长为10s
ffmpeg -f concat -i in.txt outin999.mp4
图片/视频互转命令
ffmpeg -i outin999.mp4 -f image2 image-%3d.jpeg
每秒转一张图片
-f image2将图片转为什么格式
# 图片转视频
ffmpeg -i image-%3d.jpeg out1212121.mp4
直播相关命令
ffmpeg -re -i out.mp4 -c copy -f fly 推流地址
# -re:减慢帧率速度
# 推出去的文件格式:-f fly
ffplay提供了音视频显示和播放相关的图像信息,音频的波形信息等。简而言之就是一个播放器。
播放一个音视频资源
ffplay -i input.mp4
或者
ffplay input.mp4
指定视频起始位置及播放时长播放
ffplay -ss 10 -t 20 input.mp4
## 从视频的第10秒开始播放,播放20秒
自定义播放器的显示窗口标题
ffplay -window_title "hello world" input.mp4
播放音频文件以波形的形式显示
ffplay -showmode 1 input.mp3
ffprobe是多媒体分析工具,比如音视频的参数、媒体容器的参数信息等。也可以分析媒体文件中每个包的长度、包的类型、帧的信息等。
查看多媒体数据包信息
ffprobe -show_packages input.mp4
## 可以将打印的日志保存在文本中,这样方便查找
ffprobe -show_packets input.mp4 >log.log
show_packets 查看的多媒体数据包信息使用PACKET标签括起来,其中包含的主要信息如下:
字段 | 描述 |
---|---|
codec_type | 多媒体类型,表示该段是音频包还是视频包等 |
stream_index | 表示多媒体的stream 索引 |
pts | 表示多媒体的显示时间值 |
pts_time | 根据不同格式计算过后的多媒体的显示时间 |
dts | 多媒体解码时间值 |
dts_time | 根据不同格式计算过后的多媒体解码时间 |
duration | 多媒体包占用的时间值 |
duration_time | 根据不同格式计算过后的多媒体包所占用的时间值 |
size | 多媒体包的大小 |
pos | 多媒体所在的文件偏移位置 |
flags | 多媒体包标记,如关键包与非关键包的标记 |
查看媒体包中具体的数据
ffprobe -show_data -show_packets input.mp4
查看多媒体的封装格式
ffprobe -show_format input.mp4
字段 | 描述信息 |
---|---|
filename | 表示文件名 |
nb_streams | 表示媒体中包含的流的个数 |
nb_programs | 表示节目数 |
format_name | 表示使用的封装模块的名称 |
format_long_name | 表示封装的完整名称 |
start_time | 表示媒体的起始时间 |
duration | 表示媒体文件的总时间长度 |
size | 表示媒体文件的大小 |
bit_rate | 表示媒体文件的码率(bit/s) |
probe_score | 表示输入媒体文件的格式与其实际数据格式的匹配度,匹配度高则得分高,例如 input.mp4 确实是 mp4 格式),匹配度低则得分低(比如:input.mp4 其实是 wav 的格式 |
查看视频文件中的帧信息(最常用命令)
ffprobe -show_frames input.mp4
例如:输入如下命令
ffprobe -show_frames https://sdk-release.qnsdk.com/1080_60_5390.mp4 > input.log
## 显示结果如下图
字段 | 描述信息 |
---|---|
media_type | 表示帧的类型(视频、音频、字幕等) |
stream_index | 表示帧所在的索引区域 |
key_frame | 表示是否为关键帧 |
pkt_pts | 表示Frame包的pts |
pkt_pts_time | 表示Frame包的pts的时间显示 |
pkt_dts | 表示Frame包的dts |
pkt_dts_time | 表示Frame包的dts的时间显示 |
pkt_duration | Frame包的时长 |
pkt_duration_time | 表示Frame包的时长时间显示 |
pkt_pos | 表示Frame包的所在文件的偏移位置 |
pkt_size | 表示Frame包的大小 |
width | 帧显示的宽度 |
height | 帧的显示高度 |
pix_fmt | 帧的图像色彩格式 |
pict_type | 帧类型 |
SIDE_DATA | 表示视频中包含SEI信息 |
在音视频测试中,经常会用到该命令 ffprobe -show_frames input.mp4 > demo.log
,将日志保存至本地文件,这样方面查看数据帧信息。当查看视频中有多少个关键帧时,可以在文件中搜索 pict_type=I
,pict_type 字段可以看到视频的帧是I帧
、P帧
或者B帧
,也可以通过 pict_type=I,计算出关键帧时间;每一帧的大小也可以通过 ffprobe 的 pkt_size 查看到。
后续还会为小伙伴们补充相关知识,如果感觉博主的文章还不错的话,还请点赞、收藏哦!