基于 ACM Multimedia 2022 短视频流挑战赛的自适应预加载算法实现,通过智能带宽预测与动态预加载策略,在保障用户体验(QoE)的同时显著降低带宽浪费。
本项目针对短视频应用(如 TikTok/抖音)中的流式传输优化问题,设计并实现了一套自适应预加载算法。在短视频场景中,用户通过滑动方式观看视频,系统需要预加载当前视频和推荐队列中的视频以保证流畅播放,但用户可能随时滑动跳过,导致预加载数据浪费。
核心挑战:如何在保证用户体验质量(QoE)的同时最小化带宽浪费,是多变的网络状态和不确定的用户行为下的关键难题。
解决方案:提出四级优化策略——三级网络状态分类、基于条件概率的动态预加载决策、自适应下载优先级调度、码率增强机制,实现 QoE 与带宽效率的最优平衡。
对比 Baseline 算法在 4 种网络环境下的平均性能:
| 指标 | 提升幅度 |
|---|---|
| 综合得分(Score) | +45.41% |
| 用户体验质量(QoE) | +7.53% |
| 带宽使用量 | -9.00% |
| 带宽浪费 | -21.03% |
| 下载/观看时间比 | -10.17% |
详细测试结果见 result.txt。
numpy>=1.21.0 pandas>=1.5.0 scipy>=1.9.0 matplotlib>=3.5.0 seaborn>=0.12.0 scikit-learn>=1.0.0
克隆仓库
git clone <repository-url>
cd Short-Video-Streaming-Challenge
安装依赖
pip install -r requirements.txt
运行算法
# 运行自定义算法
python run.py --solution ./
# 运行基线算法对比
python run.py --baseline no_save
# 指定网络环境测试
python run.py --solution ./ --trace high
构建镜像
docker build -t short-video-streaming .
运行容器
docker run -it -v $(pwd):/workspace short-video-streaming
在容器内运行算法
cd Short-Video-Streaming-Challenge
python run.py --solution ./
点击 CNB 平台的「云原生开发」按钮,直接进入预配置的开发环境(包含 Python 3.13、VS Code Server、所有依赖)。
. ├── Dockerfile # Docker 开发环境配置 ├── .cnb.yml # CNB 云原生构建配置 ├── LICENSE # MIT 开源许可证 ├── requirements.txt # Python 依赖 ├── README.md # 项目文档 ├── Overview.md # 详细项目概述 ├── setting.json # VS Code 配置 └── Short-Video-Streaming-Challenge/ ├── solution.py # 核心算法实现(204行) ├── run.py # 仿真平台主程序 ├── analysis.ipynb # 数据分析与可视化 ├── result.txt # 性能测试结果 ├── test.sh # Bash 测试脚本(Linux/macOS) ├── run_all.ps1 # PowerShell 测试脚本(Windows) │ ├── simulator/ # 仿真器模块 │ ├── controller.py # 环境控制器(191行) │ ├── mpc_module.py # MPC 算法模块(124行) │ ├── video_player.py # 视频播放器(164行) │ ├── user_module.py # 用户行为模型 │ ├── network_module.py # 网络模拟 │ └── short_video_load_trace.py # 数据加载 │ ├── baseline/ │ └── no_save.py # 基线算法(187行) │ ├── quickstart/ │ └── fix_preload.py # 快速入门示例 │ ├── data/ # 数据集 │ ├── network_traces/ # 网络带宽 trace(4类×20条) │ │ ├── high/ # 高带宽网络 │ │ ├── low/ # 低带宽网络 │ │ ├── medium/ # 中等带宽网络 │ │ └── mixed/ # 混合波动网络 │ ├── short_video_size/ # 视频数据(7视频×3码率) │ └── user_ret/ # 用户留存模型(7视频) │ ├── image/ # 可视化图表(11张) │ ├── network_bandwidth_distribution.png │ ├── network_timeseries.png │ ├── video_data_analysis.png │ ├── user_retention_part1.png │ ├── user_retention_part2.png │ ├── bandwidth_prediction_*.png # 4种网络预测图 │ ├── performance_radar_chart.png │ └── improvement_percentage_bars.png │ ├── file/ # 文档与参考资料 │ ├── Official_README.md # 官方比赛说明 │ ├── README_B.md # Baseline 说明 │ ├── README_Q.md # Quickstart 说明 │ ├── README_S.md # Solution 说明 │ ├── ShortVideoPreloading.md # 问题与算法详解 │ ├── 短视频预加载的数据分析和算法设计.pdf # 详细报告 │ ├── video_data_illustration.jpeg │ ├── 图1:短视频场景下的视频播放流程.png │ └── 图2:短视频模拟器框架.png │ ├── logs/ # 测试日志 │ ├── log.txt # Solution 日志 │ ├── log_nosave.txt # Baseline 日志 │ ├── log_fixpreload.txt # Quickstart 日志 │ └── sample_user/ # 用户行为采样 │ └── submit/ # 提交文件 ├── README.md # 提交说明 ├── submit.zip # 提交包 └── submit/solution.py # 精简版提交代码
# 计算用户留存条件概率
cond_p = retention[chunk_i] / retention[current]
# 动态阈值调整
threshold = base_threshold + 0.08 * buffer_factor
模型预测控制(MPC)通过枚举未来 5 个 chunk 的所有码率组合(3^5 = 243 种),选择使奖励最大化的组合:
reward = (bitrate_sum/1000.0)
- (REBUF_PENALTY * rebuffer_time/1000.0)
- (smoothness_diffs/1000.0)
QoE = Σ(w₁ × bitrateⱼ - w₂ × rebufferⱼ - w₃ × smoothⱼ) 权重系数: - w₁ (码率权重) = 1 - w₂ (卡顿权重) = 1.85 - w₃ (平滑度权重) = 1 - w₄ (带宽浪费惩罚) = 0.5
cd Short-Video-Streaming-Challenge
./test.sh
功能:
cd Short-Video-Streaming-Challenge .\run_all.ps1
功能:
项目包含完整的数据分析 Notebook(analysis.ipynb),提供丰富的可视化分析:
| 网络带宽分布 | 网络带宽时序 |
|---|---|
![]() | ![]() |

| 用户留存 (Part 1) | 用户留存 (Part 2) |
|---|---|
![]() | ![]() |
| High网络 | Low网络 | Medium网络 | Mixed网络 |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
| 性能雷达图 | 提升幅度对比 |
|---|---|
![]() | ![]() |
欢迎提交 Issue 和 Pull Request!
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)本项目基于以下研究工作:
更多技术细节见 Overview.md。
本项目采用 MIT License 开源许可证。
如果本项目对你有帮助,欢迎 ⭐ Star 支持!