32 int format_probesize; 用于识别 format。在 avformat_open_input方法中使用
/**
* number of bytes to read maximally to identify format.
* - encoding: unused
* - decoding: set by user
*/
int format_probesize;
在 avformat_open_input 方法中使用,用于识别 format,也就是音频 的格式 AAC 或者视频的 格式 YUV420P 。
当前打印结果为1m,是当前的默认值,这个默认值是根据系统不同决定的,有可能在linux下是5m。
//avformatContext->format_probesize = 1048576 单位是字节,1048576字节/1024 = 1024 kb ;1024kb /1024 = 1M,也就是说,默认,可以探测的最大字节为1M
cout << "avformatContext->format_probesize = " << avformatContext->format_probesize << endl;
format_probesize 字段
在解复用的时候使用,我们知道 avformat_open_input()方法和avformat_find_stream_info()方法在解复用的开始就需要调用,avformat_open_input()方法是解析 mp4等有文件头的,avformat_find_stream_info()方法是解析 h264等没有文件头的。目的都是找到文件的 元数据信息。
问题是,这个format_probesize字段的大小,仅是 avformat_open_input方法中生效,还是 avformat_find_stream_info中也生效,还是在哪里生效?
通过查看源码知道
format_probesize字段是在avformat_open_input()方法的时候就使用的,也就是说,在解析



在 avformat_find_stream_info方法实现中没有看到使用。
format_probesize 是 AVFormatContext 结构体中的一个成员变量,它用于指定在尝试打开文件时,FFmpeg 应该读取的最大字节数来探测文件格式。这个参数对于自动检测文件格式非常重要,特别是在文件头部没有足够的格式信息(如扩展名不正确或者文件损坏)的情况下。
作用
-
格式探测:当FFmpeg尝试打开一个文件时,它首先会读取一定数量的字节(由
format_probesize指定)来尝试识别文件的格式。例如,如果设置了较大的format_probesize,FFmpeg会读取更多的数据来尝试更准确地确定文件的格式,这有助于处理一些边缘情况,如文件头部有损坏或格式不明显的情况。 -
性能考虑:增加
format_probesize可以提高格式探测的准确性,但同时也会增加读取和处理数据的时间。因此,这个值需要根据具体情况进行调整,以平衡准确性和性能。
AVFormatContext 的 format_probesize 字段解析
format_probesize 是 AVFormatContext 中用于 控制媒体格式探测阶段读取的数据量大小 的关键参数,直接影响封装格式的识别精度与效率16。
1. **核心功能
- 数据探测范围:
定义 FFmpeg 在初始化解封装时分析的最大数据量(单位:字节),用于判断媒体文件的封装格式(如 MP4、FLV、TS 等)16。- 值越大:探测范围更广,可提高复杂或分散格式的识别成功率(例如多流混合或元数据分散的媒体文件)6。
- 值越小:减少 I/O 延迟,但可能导致格式探测失败(数据不足无法匹配特征)1。
2. **默认值与调整
- 默认值:
5,000,000字节(约 5MB),适用于绝大多数场景16。 - 手动设置:
cCopy Code
AVFormatContext *format_ctx = avformat_alloc_context();
format_ctx->format_probesize = 10 * 1024 * 1024; // 设为 10MB avformat_open_input(&format_ctx, filename, NULL, NULL);
3. **典型应用场景
- 网络流探测:
对于实时流(如 RTMP、HLS),若初始数据包中格式信息分散,需增大format_probesize以确保正确识别15。 - 非常规封装格式:
自定义或非标准格式可能需扩展探测范围以提取足够特征6。
4. **注意事项
- 性能权衡:
增大此值会延长初始化解封装的时间,尤其在网络传输或高延迟存储中更明显16。 - 探测失败处理:
若格式识别错误或返回AVERROR_INVALIDDATA,可尝试逐步增加format_probesize并重试6。
总结
format_probesize 通过控制探测数据量平衡格式识别的精度与效率,需根据媒体类型(本地文件/网络流)和封装复杂度灵活调整15。
34 int fps_probe_size;在解复用中计算video的fps。在avformat_find_stream_info方法中使用
/**
* The number of frames used for determining the framerate in
* avformat_find_stream_info().
* Demuxing only, set by the caller before avformat_find_stream_info().
*/
int fps_probe_size;
打印一下,结果为 avformatContext->fps_probe_size = -1
cout << "avformatContext->fps_probe_size = " << avformatContext->fps_probe_size << endl;
在 解复用的时候,设置读取多少帧,才能计算出 video的fps。如果不设置,默认值是-1;为啥是-1?看源码。发现在解复用的时候,真的用多少帧,是由于很多值决定的。且开始的时候,会赋值一个20.
-
解码时:
fps_probe_size用于指定在尝试探测视频流的真实帧率时,应该查看多少帧。这对于某些编码格式,特别是那些不直接在头部信息中明确标明帧率的格式(如 MPEG-TS),非常有用。通过查看连续几帧的时间戳差值,可以估算出实际的帧率。 -
编码时,不一定有用
编码时:虽然主要用于解码时的帧率探测,但在某些情况下,编码器也可能使用这个参数来设置期望的帧率(例如,通过设置 muxer 的时间基)。但通常,编码器的帧率设置是通过其他方式(如编码器特定的选项)来控制的。
核心功能定位
-
fps_probe_size:
用于 帧率(FPS)探测阶段的数据量控制,指定在分析视频流时需读取的初始数据量,以计算准确的帧率值。- 适用场景:当视频流头部未明确包含帧率信息(如某些实时流或自定义封装格式时),需通过一定量的数据样本推导帧率。
- 调整影响:增大此值可能提升帧率计算精度,但会增加初始解析时间。
参见源码,源码中这块很复杂,
在 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)方法中。

设置为25帧,通过25帧计算 fps,也就是25帧的平均fps
AVFormatContext* formatCtx = avformat_alloc_context();
if (!formatCtx) {
fprintf(stderr, "Could not allocate format context\n");
exit(1);
}
// 设置 fps_probe_size 为 25,例如
formatCtx->fps_probe_size = 25;
35 int64_t probesize; 在解复用中使用,avformat_find_stream_info 方法中使用
/**
* Maximum size of the data read from input for determining
* the input container format.
* Demuxing only, set by the caller before avformat_open_input().
*/
int64_t probesize;
//avformatContext->probesize = 5000000,单位是字节 。 probe_size(format_probesize)默认约为 5MB(5,000,000 字节)
cout << "avformatContext->probesize = " << avformatContext->probesize << endl;
36 int64_t max_analyze_duration; 解复用时使用,在avformat_find_stream_info 方法中使用
/**
* Maximum duration (in AV_TIME_BASE units) of the data read
* from input in avformat_find_stream_info().
* Demuxing only, set by the caller before avformat_find_stream_info().
* Can be set to 0 to let avformat choose using a heuristic.
*/
int64_t max_analyze_duration;
*从avformat_find_stream_info()中的输入读取数据的最大持续时间(以AV_TIME_BASE为单位)。
*仅限解复用,由调用者在avformat_find_stream_info()之前设置。
*可以设置为0,让avformat使用heuristic(启发式方法)进行选择。
max_analyze_duration 是 FFmpeg 中 AVFormatContext 结构体的关键字段,主要用于控制 流信息探测阶段的时长和数据量,直接影响媒体元数据(如编码格式、帧率、分辨率等)的解析效率和准确性17。
1. 核心功能
- 作用阶段:在调用
avformat_find_stream_info()时生效,用于限制 FFmpeg 解析流信息的最大时间或数据量18。 - 控制目标:决定探测阶段读取的媒体数据时长(单位:微秒),确保在合理时间内获取流参数,避免因数据量过大导致延迟78。
2. 参数设置与影响
| 属性 | 说明 |
|---|---|
| 默认值 | 通常为 5 * AV_TIME_BASE(即 5 秒) |
| 单位 | 微秒(需通过 AV_TIME_BASE 宏转换,例如 5 * AV_TIME_BASE 表示 5 秒) |
| 调优场景 | 网络流、实时流等需要快速起播的场景,可适当减小值以减少探测时间;非标准格式或复杂流需增大值以提高解析成功率 |
| 负面影响 | 值过小可能导致流信息解析失败(如无法获取帧率或编码参数);值过大可能增加初始延迟78 |
3. 代码示例
AVFormatContext *fmt_ctx = avformat_alloc_context();
avformat_open_input(&fmt_ctx, input_file, NULL, NULL);
// 设置最大分析时长(例如设置为 2 秒)
fmt_ctx->max_analyze_duration = 2 * AV_TIME_BASE;
// 启动流信息探测
avformat_find_stream_info(fmt_ctx, NULL);
4. 关联参数
-
probesize:限制探测阶段读取的最大数据量(字节数),与max_analyze_duration共同控制探测行为的资源消耗。 -
fps_probe_size(若存在):专用于帧率探测的数据量控制,优先级低于max_analyze_duration。
5. 优化建议
- 实时流场景:将
max_analyze_duration设为1 * AV_TIME_BASE(1 秒)以内,结合probesize减小探测数据量,实现快速起播78。 - 复杂流处理:若流头部信息不完整,需增大此值(如
10 * AV_TIME_BASE)以提高格式识别成功率78。 - 已知流格式时:直接通过
AVCodecParameters设置解码器参数,跳过探测阶段以提升效率7。
总结
max_analyze_duration 是流媒体解析性能调优的核心参数,需根据场景平衡 解析精度 与 响应速度,结合 probesize 参数实现最佳效果17。
32-36 总结
int format_probesize; 在解复用中用于识别 format。在 avformat_open_input方法中使用。默认值是1M 或者5M,
- 值越大:探测范围更广,可提高复杂或分散格式的识别成功率(例如多流混合或元数据分散的媒体文件)。
- 值越小:减少 I/O 延迟,但可能导致格式探测失败(数据不足无法匹配特征)。
int fps_probe_size;在解复用中计算video的fps。在avformat_find_stream_info方法中使用。看源码,一般情况下默认值应该是20.
- 适用场景:当视频流头部未明确包含帧率信息(如某些实时流或自定义封装格式时),需通过一定量的数据样本推导帧率。
- 调整影响:增大此值可能提升帧率计算精度,但会增加初始解析时间。可以调整为25
- 计算25帧的数据,以计算fps
int64_t probesize; 在解复用中使用,avformat_find_stream_info 方法中使用。
默认值 是 5000000字节,也就是大约 5M
调整影响:增大此值在解复用时,多解析字节。但是会有I/O延迟。减小可以快一些。
int64_t max_analyze_duration; 解复用时使用,在avformat_find_stream_info 方法中使用.
如果是0,则ffmpeg 使用启发式方式自动设置。
一般默认值是 通常为 5 * AV_TIME_BASE(即 5 秒)
| 调优场景 | 网络流、实时流等需要快速起播的场景,可适当减小值以减少探测时间;非标准格式或复杂流需增大值以提高解析成功率 |
| 负面影响 | 值过小可能导致流信息解析失败(如无法获取帧率或编码参数);值过大可能增加初始延迟 |
优化建议
- 实时流场景:将
max_analyze_duration设为1 * AV_TIME_BASE(1 秒)以内,结合probesize减小探测数据量,实现快速起播。 - 复杂流处理:若流头部信息不完整,需增大此值(如
10 * AV_TIME_BASE)以提高格式识别成功率。 - 已知流格式时:直接通过
AVCodecParameters设置解码器参数,跳过探测阶段以提升效率7。
1945

被折叠的 条评论
为什么被折叠?



