书籍基本信息
书名: 《深入理解FFmpeg》
作者: 刘歧、杜金房、宋韶颍 等
出版社: 电子工业出版社
出版时间: 2020 年
适合读者: FFmpeg 开发者、音视频工程师、对 FFmpeg 源码感兴趣的技术人员。深入理解
深入理解FFmpeg - 第1章 多媒体基础 - 刘歧 赵军 杜金房 赵文杰 宋韶颍 - 微信读书
目标
总结第三章核心知识点,以及前面文章未提到的一些信息。
3.1 ffmpeg常用命令
因为ffmpeg功能庞大所以使用信息很多,可以通过下列命令查询不同等级
查看基础帮助信息:
ffmpeg --help
查看高级帮助信息:
ffmpeg --help long
查看全部帮助信息:
ffmpeg --help full
查看支持的许可证协议:
ffmpeg -L
版本功能支持查询
下列基础上加上 -h
,可以查看详细信息。
查询支持的格式
ffmpeg -formats
输出说明:
D 表示支持解码(Demuxing)。
E 表示支持编码(Muxing)。
DE 表示同时支持解码和编码。
格式名称(如 mp4、mov、avi 等)会列在右侧
查询支持的编解码器
ffmpeg -codecs
ffmpeg -h encoder=h264 # 查看 H.264 编码器的详细信息
ffmpeg -h decoder=aac 查看 AAC 解码器的详细信息
输出说明:
-
D
表示支持解码。 -
E
表示支持编码。 -
V
表示视频编解码器。 -
A
表示音频编解码器。 -
S
表示字幕编解码器。 -
I
表示帧级编解码器(通常是图片格式)。 -
编解码器名称(如
h264
、aac
、mp3
等)会列在右侧。
查询支持的协议
ffmpeg -protocols
输出说明:
-
I
表示支持输入协议。 -
O
表示支持输出协议。 -
IO
表示同时支持输入和输出。
查询支持的滤镜
ffmpeg -filters
输出说明:
-
每个滤镜的名称和功能会列出来。
-
例如:
scale
(缩放)、crop
(裁剪)、rotate
(旋转)等。
其他
甚至还可以查询支持的图像格式以及音频采样率比如:
ffmpeg -h muxer=mp4 # 查看 MP4 格式的封装器(Muxer)信息
ffmpeg -h demuxer=mov # 查看 MOV 格式的解封装器(Demuxer)信息
查询像素格式支持
ffmpeg -pix_fmts
查询采样格式支持
ffmpeg -sample_fmts
查询硬件加速支持
ffmpeg -hwaccels
总结
在使用前,我们应该确定ffmpeg版本是否支持我们的需求!
ffmpeg -h encoder/decoder/muxer/demuxer/filter=xxx
3.1.1 封装转换
ffmpeg AVFormatContext主要参数帮助
3.1.2 解码和编码
ffmpeg AVCodecContext主要参数
3.2 ffprobe常用命令
ffprobe有许多选项(参数),可以用来指定输出的格 式、查看的信息等。下面是一些常用的选项:
-v:指定输出的详细程度。0为较少的信息,9为更 多的信息。
-show_format:查看媒体文件的容器信息,包括格式、时长、码率等。
-show_streams:查看媒体文件的流信息,包括编码 格式、帧率、分辨率等。
-show_chapters:查看媒体文件的章节信息。
-of:指定输出的格式,支持的格式包括JSON、XML 等。
ffprobe -v 9 -show_format -show_streams -show_chapters -of json video.mp4
查看多媒体数据包信息
ffprobe -show_packets input.flv
结合 -show_data 参数,还可以查看数据包中的具体二进制数据。
ffprobe -show_data -show_packets input.flv
查看多媒体的封装格式
ffprobe -show_format output.mp4
format关键字段说明
查看多媒体文件帧信息
ffprobe -show_frames input.flv
查看多媒体文件中的流信息
ffprobe -show_streams 1.mp4
输出格式设置
ffprobe -of <format> [其他选项] input.mp4
-of
:指定输出的格式
用于指定输出信息的格式,支持的格式包括:
-
default
:人类可读的文本格式。 -
json
:适合程序化处理。 -
xml
:适合结构化数据。 -
csv
:适合导入到电子表格或数据库。 -
ini
:适合配置文件。 -
flat
:适合简单的键值对处理。
指定流
-select_streams <流选择器>
只选择视频流分析
ffprobe -select_streams v -show_frames -of json input.mp4
流选择器:
-
v
:视频流。 -
a
:音频流。 -
s
:字幕流。 -
d
:数据流。 -
t
:附件流。 -
可以指定流的索引(如
v:0
表示第一个视频流,a:1
表示第二个音频流)。
指定字段
前面已经总结了一大堆信息,现在只需要指定字段如何做?
-show_entries <模块名>=<字段1>,<字段2>,...
#提取视频流中所有关键帧的时间戳和文件位置
ffprobe -select_streams v -show_streams -of csv
-show_entries frame=key_frame,pkt_pts_time,pkt_pos -i 1.mp4
#提取视频流的分辨率和编码格式
ffprobe -select_streams v
-show_entries stream=width,height,codec_name -of csv input.mp4
#提取音频流的采样率和声道数
ffprobe -select_streams a
-show_entries stream=sample_rate,channels -of csv input.mp4
模块名:
-
format
:容器格式信息(对应-show_format
)。 -
stream
:流信息(对应-show_streams
)。 -
frame
:帧信息(对应-show_frames
)。 -
packet
:数据包信息(对应-show_packets
)。 -
program
:节目信息(对应-show_programs
)。 -
chapter
:章节信息(对应-show_chapters
)。
日志级别
如果 moov
box 位于文件末尾,播放器需要下载整个文件才能开始播放,这会导致视频加载时间变长。通过 FFmpeg 的 -movflags faststart
参数,可以将 moov
box 前移到文件头部。这点在播放器秒播有提到!
https://i-blog.csdnimg.cn/direct/a7ecad3abebe4a0fa5dce8171b3ae0a7.png播放器秒开优化2-优快云博客
播放器秒开优化_ios ijkplayer 预加载-优快云博客https://i-blog.csdnimg.cn/direct/a7ecad3abebe4a0fa5dce8171b3ae0a7.png
查看 moov
box 的位置
ffprobe -loglevel trace input.mp4
搜索 moov
关键字,可以找到类似以下的信息: type:'moov' parent:'root' sz: 15052
将 moov
box 前移到文件头部
ffmpeg -i input.mp4 -movflags faststart -c copy output.mp4
再次查看验证box位置即可。
3.3.1 ffplay常用参数
ffplay -window_title "播放测试" rtmp://up.v.test.com/live/stream
ffplay高级参数
具体使用ffplay --help参数查看更多
ffplay播放快捷键
罕见用法
以音频波形图输出音频
ffplay -showmode 1 output.mp3
查看宏块和运动矢量信息
查看视频解码过程中的宏块信息
兼容性差写法:
ffplay -debug vis_mb_type -i input.mp4
常用写法:
使用 codecview 滤镜查看宏块信息/查看视频的运动矢量信息
ffplay -i input.mp4 -flags2 +export_mvs -vf codecview=mv=pf+bf+bb
查看视频的量化参数(QP)信息
ffplay -i input.mp4 -flags2 +export_mvs -vf "codecview=mv=pf+bf+bb,qp"
结合 ffprobe 查看宏块信息
ffprobe -show_frames
-show_entries frame=pict_type,coded_picture_number,mb_type
-of csv input.mp4
-debug vis_mb_type:启用宏块类型的可视化调试信息。
-flags2 +export_mvs
:启用运动矢量导出。
-vf codecview=mv=pf+bf+bb
:使用 codecview
滤镜显示运动矢量信息。
-
mv=pf+bf+bb
:显示前向预测(P 帧)、双向预测(B 帧)和后向预测(B 帧)的运动矢量。
-show_frames
:显示帧信息。
-show_entries frame=pict_type,coded_picture_number,mb_type
:指定输出帧的 pict_type
(帧类型)、coded_picture_number
(编码帧序号)和 mb_type
(宏块类型)。
-of csv
:输出格式为 CSV。
运动矢量示例图
学习资料分享