自建HLS服务器架构图

自建 M3U8 视频服务器是实现定制化流媒体分发、控制内容安全和节省云服务成本的有效方式。本教程将引导你完成从**视频切片**到**服务器配置**的全过程,最终实现高效的 HLS(HTTP Live Streaming)视频流点播。

第一步:准备工作与环境搭建

你需要准备以下工具和环境:

  • **服务器:** 一台可访问的 Linux 服务器(推荐 Ubuntu/CentOS)。
  • **Web 服务器:** 推荐使用 **Nginx**,它性能高、配置简单,非常适合文件分发。
  • **转码工具:** **FFmpeg**,用于将原始视频切片和转码。
  • **源视频:** 一个 MP4 或其他格式的源视频文件。

确保 Nginx 和 FFmpeg 已安装并配置完毕。

# Linux安装FFmpeg
sudo apt update
sudo apt install ffmpeg

第二步:视频切片与 M3U8 文件生成

我们将使用 FFmpeg 将原始 MP4 文件切片,并生成 M3U8 播放列表。为了实现自适应码率,我们以生成一个 720p 单码率流为例。

1. 创建视频目录

在 Nginx 的网站根目录下(例如 `/var/www/html/`),创建一个用于存放视频的目录,例如 `hls_video/`。

mkdir -p /var/www/html/hls_video

2. 运行 FFmpeg 切片命令

使用以下命令将你的 `input.mp4` 切片:

ffmpeg -i input.mp4 \
    -c:v libx264 -c:a aac \
    -vf scale=1280:720 \
    -hls_time 10 \
    -hls_list_size 0 \
    -hls_segment_filename "hls_video/seg%03d.ts" \
    hls_video/index.m3u8
  • `-vf scale=1280:720`:将视频分辨率调整为 720p。
  • `-hls_time 10`:将每个片段 (`.ts`) 的时长设置为 10 秒。
  • `-hls_list_size 0`:表示播放列表包含所有片段(VOD点播)。
  • `hls_video/index.m3u8`:生成的播放列表文件。

命令运行完成后,`hls_video` 目录下会生成 `index.m3u8` 和大量的 `.ts` 片段。

第三步:Nginx 服务器配置(核心步骤)

Web 服务器必须正确配置 **MIME 类型**和 **CORS 头部**,否则播放器将无法识别文件或因为跨域限制而拒绝加载。

1. 配置 MIME 类型

编辑 Nginx 配置文件(通常在 `/etc/nginx/nginx.conf` 或 `/etc/nginx/mime.types`),确保添加了 M3U8 和 TS 文件的正确类型:

# /etc/nginx/mime.types 或 sites-enabled/default 文件的 http 块中
types {
    # ... 其他类型
    application/vnd.apple.mpegurl m3u8;
    video/mp2t ts;
}

2. 配置 CORS 跨域访问

在你的 Nginx `server` 块或 `location` 块中,添加以下头部,允许任何域名的网页请求你的视频文件:

server {
    listen 80;
    server_name your-domain.com;

    location /hls_video/ {
        # 视频文件存放的实际路径
        alias /var/www/html/hls_video/;

        # 启用 CORS (非常重要)
        add_header Access-Control-Allow-Origin "*";
        add_header Access-Control-Allow-Headers "*";
        add_header Cache-Control "no-cache";
        
        # 允许浏览器直接访问 M3U8 文件
        default_type application/vnd.apple.mpegurl;
    }
}

3. 重启 Nginx

保存配置后,重启 Nginx 使更改生效:

sudo systemctl restart nginx

第四步:测试与验证

现在你可以通过以下方式测试你的 HLS 流:

1. 浏览器访问 M3U8

在浏览器中输入 M3U8 的 URL: `http://your-domain.com/hls_video/index.m3u8`。你应该能看到 M3U8 的文本内容,而不是下载文件或错误页面。

2. 使用播放器测试

将上述 URL 粘贴到支持 HLS 的播放器中进行测试,例如:

  • **VLC Media Player:** 打开网络串流。
  • **本站在线播放器:** 访问 M3U8播放器,粘贴链接并播放。
  • **FFmpeg 验证:** 使用 FFmpeg 调试命令 检查流的完整性。

高级配置:安全与优化

1. 开启内容加密 (AES-128)

如果需要加密,在 **FFmpeg 切片**时加入密钥信息文件:

# 假设你已经准备好 enc.keyinfo 文件
ffmpeg -i input.mp4 -c copy -hls_key_info_file enc.keyinfo output.m3u8

详情请参考 M3U8加密视频处理指南

2. 使用 CDN 加速分发

对于商业应用或高并发场景,你需要将视频文件部署到 **CDN(内容分发网络)**。将 Nginx 作为 CDN 的**源站 (Origin Server)**,CDN 会缓存 M3U8 和 `.ts` 文件,大大提升全球用户的播放速度和并发能力。

3. 部署自适应码率 (ABR)

如果你生成了 720p, 1080p, 480p 等多个流,确保你的 **Master M3U8** 中正确包含了所有的子 M3U8 文件和它们的 `BANDWIDTH` 信息。

总结

自建 M3U8 视频服务器涉及视频转码切片和 Web 服务器配置两个核心环节。通过 **FFmpeg** 和 **Nginx** 的组合,你可以完全掌控你的流媒体基础设施,实现高效、可靠且可定制的视频点播和直播服务。记住,正确的 MIME 类型和 CORS 配置是确保 HLS 播放成功的关键。

返回博客列表