目录
一、自适应码率流的核心概念
1.1、流媒体传输的挑战
在实时视频传输中,网络带宽的动态变化可能导致卡顿或画质下降。自适应码率流(Adaptive Bitrate Streaming, ABS)通过动态切换不同码率的视频流,确保用户在不同网络条件下获得最佳体验。
图1.1、自适应码流流程
1.2、HLS与DASH协议简介
HLS (HTTP Live Streaming):苹果公司提出的基于HTTP的分段流协议,通过m3u8索引文件描述多个码率的媒体片段(TS或MP4)。
DASH (Dynamic Adaptive Streaming over HTTP):MPEG标准,使用MPD清单文件管理媒体片段(通常为MP4),支持更灵活的编码组合。
1.3、多码率自适应的算法原理
客户端根据当前带宽选择合适码率的流,服务端需预先生成多个不同分辨率和码率的视频流,并通过分片机制(通常2-10秒一个片段)实现无缝切换,使用目标优化,Buffer建模,卡尔曼滤波,目标求解算法保证视频的清晰度、流畅度及平滑性。
图2.1、多码率自适应算法
二. FFmpeg多码率输出的核心设计
2.1、单解码多编码架构
FFmpeg的典型处理流程为 解码→处理→编码→复用。在多码率场景中,核心优化点在于:
// 单解码多编码流程
AVPacket pkt;
AVFrame *frame = av_frame_alloc();
while (av_read_frame(input_ctx, &pkt) == 0) {
if (pkt.stream_index == video_stream_idx) {
avcodec_send_packet(decoder_ctx, &pkt);
while (avcodec_receive_frame(decoder_ctx, frame) == 0) {
for (OutputStream &out : outputs) {
scale_frame(frame, out.scaled_frame); // 缩放
encode_and_write(out, out.scaled_frame); // 编码与写入
}
}
}
}