前言:
😄作者简介:小曾同学.com,小伙伴们也可以叫我小曾,一个致力于测试开发的博主⛽️
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊
座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!
👍
之前给小伙伴们分享了在Mac中安装FFMPEG,今天主要给大家整理了下在音视频测试
中经常使用的FFMPEG
相关命令。
1 FFMPEG概念
FFmpeg
是一款音视频编解码
工具,也是一组音视频编解码开发套件,为开发者提供了丰富的音视频处理调用接口。
FFmpeg
源代码编译后会生成几个可执行程序,分别是ffmpeg
、ffplay
、ffprobe
,这三个也称为 FFmpeg 三剑客
,各有各的作用,接下来就给大家一一介绍。
2 ffmpeg 介绍
2.1 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
进行封装,最终输出为输出流。
2.2 ffmpeg常用命令
-
基本信息查询命令
字段 描述信息 -version 表示显示版本信息 -formats 表示可用格式 -muxers 显示可用复用器 -demuxers 显示可用解复用器 -codecs 显示可用编解码器 -decoders 显示可用解码器 -encoders 显示可用编码器 -protocols 显示可用的协议 -pix_fmts 显示可用的像素格式 -
录制命令
- 录制视频
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
3 ffplay 常用命令
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
4 ffprobe常用命令
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 查看到。
后续还会为小伙伴们补充相关知识,如果感觉博主的文章还不错的话,还请点赞、收藏哦!