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表現,平衡延遲、流暢性和視頻質量。
?