当前位置: 首页 > news >正文

FFmpeg QoS 处理

FFmpeg 中的 QoS (服务质量) 处理主要关注于实时流媒体传输中的时序控制、丢帧策略和网络适应等方面。以下是 FFmpeg 中 QoS 相关的关键机制和配置方法。

1. 基本 QoS 机制

丢帧策略 (Frame Dropping)

c

AVDictionary *options = NULL;
av_dict_set(&options, "framedrop", "1", 0);  // 启用丢帧
  • framedrop 参数:

    • 0: 不丢帧(默认)

    • 1: 在解码器处丢帧(当解码落后时)

    • 2: 在编码器处丢帧(当编码落后时)

实时参数

c

av_dict_set(&options, "realtime", "1", 0);  // 启用实时模式

2. 网络传输 QoS

缓冲区设置

c

av_dict_set(&options, "buffer_size", "1024000", 0);  // 设置网络缓冲区大小
av_dict_set(&options, "rtbufsize", "2000000", 0);    // 实时缓冲区大小

重传和延迟控制

c

// 对于RTMP/RTSP
av_dict_set(&options, "timeout", "5000000", 0);      // 超时时间(微秒)
av_dict_set(&options, "max_delay", "500000", 0);     // 最大延迟(微秒)// 对于UDP/RTP
av_dict_set(&options, "reorder_queue_size", "50", 0); // 重排序队列大小

3. 编码器级 QoS 控制

H.264/H.265 编码器

c

av_dict_set(&options, "preset", "fast", 0);          // 编码预设
av_dict_set(&options, "tune", "zerolatency", 0);     // 零延迟模式
av_dict_set(&options, "x264opts", "no-scenecut:rc-lookahead=0", 0);

码率控制

c

av_dict_set(&options, "b", "2M", 0);                 // 目标码率
av_dict_set(&options, "maxrate", "2.5M", 0);         // 最大码率
av_dict_set(&options, "minrate", "1.5M", 0);         // 最小码率
av_dict_set(&options, "bufsize", "4M", 0);           // 码率控制缓冲区

4. 解码器级 QoS 控制

低延迟解码

c

av_dict_set(&options, "flags", "low_delay", 0);      // 低延迟标志
av_dict_set(&options, "threads", "1", 0);            // 单线程解码减少延迟

硬件加速

c

av_dict_set(&options, "hwaccel", "auto", 0);         // 自动硬件加速
av_dict_set(&options, "hwaccel_device", "0", 0);     // 指定GPU设备

5. 自适应流媒体 QoS

动态码率调整

c

av_dict_set(&options, "adaptive_quantization", "1", 0);
av_dict_set(&options, "aq-mode", "2", 0);           // 自适应量化模式

多码率输出

c

// 使用filter_complex生成多码率输出
char *filter_graph = "split=3[out1][out2][out3];""[out1]scale=1280:720[hd];""[out2]scale=854:480[sd];""[out3]scale=640:360[ld]";

6. 监控和统计

获取QoS统计信息

c

AVFormatContext *fmt_ctx = NULL;
// ...初始化fmt_ctx...
int64_t bit_rate = fmt_ctx->bit_rate;
int64_t packets = fmt_ctx->packets;
int64_t dropped = fmt_ctx->packet_drop_count;

自定义回调

c

void qos_callback(void *ptr, int level, const char *fmt, va_list vl) {// 处理QoS相关警告和错误
}
av_log_set_callback(qos_callback);

7. 实际应用示例

实时推流配置

c

AVDictionary *options = NULL;
av_dict_set(&options, "preset", "ultrafast", 0);
av_dict_set(&options, "tune", "zerolatency", 0);
av_dict_set(&options, "framedrop", "1", 0);
av_dict_set(&options, "threads", "1", 0);
av_dict_set(&options, "fflags", "nobuffer", 0);
av_dict_set(&options, "max_delay", "200000", 0);

低延迟播放配置

c

av_dict_set(&options, "fflags", "nobuffer+flush_packets", 0);
av_dict_set(&options, "flags", "low_delay", 0);
av_dict_set(&options, "framedrop", "0", 0);
av_dict_set(&options, "analyzeduration", "100000", 0);
av_dict_set(&options, "probesize", "4096", 0);

通过合理配置这些参数,可以显著提高FFmpeg在实时流媒体应用中的QoS表现,平衡延迟、流畅性和视频质量。

 

http://www.lryc.cn/news/622774.html

相关文章:

  • 《WINDOWS 环境下32位汇编语言程序设计》第2章 准备编程环境
  • 汽车行业供应链EDI标准体系解析:构建高效协同的数字桥梁
  • Blackwell 和 Hopper 架构的 GPGPU 新功能全面综述
  • 要导入StandardScaler类进行数据标准化,请使用以下语句:
  • 【计算机视觉与深度学习实战】03基于Canny、Sobel和Laplacian算子的边缘检测系统设计与实现
  • 常见的交叉编译工具链
  • 第四章:大模型(LLM)】06.langchain原理-(5)LangChain Prompt 用法
  • 【Vibe Coding 工程之 StockAnalyzerPro 记录】- EP3.Phase 2股票列表管理功能
  • Camx-Tuning参数加载流程分析
  • 力扣(LeetCode) ——622. 设计循环队列(C语言)
  • 类的生命周期与加载过程
  • LintCode第116题-跳跃游戏
  • java项目怎么实现用户行为分析、漏斗转化、数据可视化报表。
  • 【Linux系统】进程间通信:System V IPC——共享内存
  • FPGA实现I2C通信方案
  • 创建maven module中的override
  • 库的制作与原理
  • Navicat 为 SQLite 数据库设置密码指南
  • 如何使用 Git 修改已推送 Commit 的用户名和邮箱
  • 从废弃到珍宝——旧物二手回收小程序系统的价值发现之旅
  • 配置 Docker 镜像加速,解决 docker pull 拉取镜像失败、docker search 查询镜像失败等问题
  • 外出业务员手机自动添加报价单​——仙盟创梦IDE
  • PostgreSQL——事务处理与并发控制
  • 关于casdoor重定向问题
  • 力扣(最小覆盖子串)
  • Java设计模式之《工厂模式》
  • 【Java web】HTTP 协议详解
  • PO BO VO DTO POJO DAO DO概念
  • Linux第十四讲:网络基础概念
  • Jenkins Pipeline中参数化构建