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表现,平衡延迟、流畅性和视频质量。