avfromatContext 中可以优化的参数。format_probesize,fps_probe_size,probesize,max_analyze_duration

 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. ‌优化建议

  1. 实时流场景‌:将 max_analyze_duration 设为 1 * AV_TIME_BASE(1 秒)以内,结合 probesize 减小探测数据量,实现快速起播78。
  2. 复杂流处理‌:若流头部信息不完整,需增大此值(如 10 * AV_TIME_BASE)以提高格式识别成功率78。
  3. 已知流格式时‌:直接通过 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 秒)

调优场景网络流、实时流等需要快速起播的场景,可适当减小值以减少探测时间;非标准格式或复杂流需增大值以提高解析成功率
负面影响值过小可能导致流信息解析失败(如无法获取帧率或编码参数);值过大可能增加初始延迟

优化建议

  1. 实时流场景‌:将 max_analyze_duration 设为 1 * AV_TIME_BASE(1 秒)以内,结合 probesize 减小探测数据量,实现快速起播。
  2. 复杂流处理‌:若流头部信息不完整,需增大此值(如 10 * AV_TIME_BASE)以提高格式识别成功率。
  3. 已知流格式时‌:直接通过 AVCodecParameters 设置解码器参数,跳过探测阶段以提升效率7。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值