音视频开发实战

项目实战2:网络点播播放器

前置要求:完成 Chapter 4-6 目标:实现支持 HTTP/HTTPS 的网络视频播放器

项目概述

本项目将播放器扩展为支持网络视频点播,学习如何处理: - HTTP 渐进下载播放 - 网络缓冲管理 - 断网重连 - 下载进度显示

功能需求

网络播放

缓冲管理

错误恢复

关键技术

HTTP 播放原理

HTTP Range 请求:
GET /video.mp4 HTTP/1.1
Range: bytes=0-1023

服务器响应:
HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/1000000

FFmpeg 自动处理 Range 请求,实现边下边播

缓冲策略

┌─────────────────────────────────────────┐
│           网络缓冲区                     │
│  ┌─────────────────────────────────┐   │
│  │ 已下载 |=======          | 待下载 │   │
│  └─────────────────────────────────┘   │
│       ↓                                 │
│  缓冲水位线: 2秒数据                      │
│       ↓                                 │
│  足够时开始播放                           │
└─────────────────────────────────────────┘

代码示例:网络检测

bool IsNetworkUrl(const char* url) {
    return strncmp(url, "http://", 7) == 0 ||
           strncmp(url, "https://", 8) == 0;
}

void SetNetworkOptions(AVDictionary** opts) {
    // 连接超时 10 秒
    av_dict_set(opts, "timeout", "10000000", 0);
    // 读取超时 5 秒
    av_dict_set(opts, "rw_timeout", "5000000", 0);
    // TCP 无延迟
    av_dict_set(opts, "tcp_nodelay", "1", 0);
}

代码示例:重连机制

class NetworkPlayer {
public:
    bool PlayWithRetry(const char* url) {
        for (int i = 0; i < max_retries_; i++) {
            if (TryPlay(url)) {
                return true;
            }
            std::cerr << "重试 " << (i + 1) << "/" << max_retries_ << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(2));
        }
        return false;
    }
    
private:
    bool TryPlay(const char* url) {
        // 打开输入
        int ret = avformat_open_input(&fmt_ctx_, url, nullptr, &opts_);
        if (ret < 0) {
            HandleError(ret);
            return false;
        }
        // ... 播放逻辑
        return true;
    }
    
    void HandleError(int error_code) {
        switch (error_code) {
            case AVERROR_EXIT:
                std::cerr << "连接被中断" << std::endl;
                break;
            case AVERROR(ETIMEDOUT):
                std::cerr << "连接超时" << std::endl;
                break;
            default:
                char errbuf[256];
                av_strerror(error_code, errbuf, sizeof(errbuf));
                std::cerr << "错误: " << errbuf << std::endl;
        }
    }
};

项目结构

project-02/
├── CMakeLists.txt
├── README.md
├── include/
│   └── live/
│       ├── network_player.h
│       └── ... (继承 project-01)
└── src/
    ├── main.cpp
    └── network_player.cpp

运行测试

# 测试网络播放
./player "https://example.com/video.mp4"

# 测试本地文件(向后兼容)
./player test.mp4

验收标准

扩展挑战

  1. 支持 FTP 协议
  2. 实现边下边存(下载同时保存到本地)
  3. 支持多线程下载加速

完成本项目后,你将掌握: - FFmpeg 网络选项配置 - 网络超时和错误处理 - 自动重连机制 - HTTP 流播放原理