基于 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 支持!