0%

使用CDN管理M3U8文件中的TS切片

在使用CDN配合的情况下,转码后的M3U8文件中的TS路径需要根据CDN的配置进行调整,以确保客户端能够正确从CDN节点加载视频片段(TS文件)。以下是具体的设计和调整方案:


1. M3U8文件中的TS路径调整

原始M3U8文件示例

假设转码后生成的M3U8文件内容如下:

1
2
3
4
5
6
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=1500000,RESOLUTION=1280x720
720p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=854x480
480p/playlist.m3u8

子M3U8文件(如720p/playlist.m3u8)内容:

1
2
3
4
5
6
7
8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXTINF:10.0,
segment1.ts
#EXTINF:10.0,
segment2.ts
...

调整后的M3U8文件

为了让客户端从CDN加载TS文件,需要将TS路径替换为CDN的完整URL。例如:

1
2
3
4
5
6
7
8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXTINF:10.0,
https://cdn.example.com/videos/123/720p/segment1.ts
#EXTINF:10.0,
https://cdn.example.com/videos/123/720p/segment2.ts
...

2. 实现路径调整的方案

方案一:转码时直接生成CDN路径

  • 实现方式

    • 在转码工具(如FFmpeg)中配置输出路径为CDN的URL前缀。
    • 示例FFmpeg命令:
      1
      ffmpeg -i input.mp4 -c:v h264 -b:v 5M -c:a aac -f hls -hls_base_url https://cdn.example.com/videos/123/720p/ -hls_time 10 720p/playlist.m3u8
    • 生成的M3U8文件会自动包含完整的CDN路径。
  • 优点:简单直接,无需额外处理。

  • 缺点:CDN路径固定,灵活性较差。

方案二:动态替换路径

  • 实现方式

    • 转码时生成相对路径的M3U8文件。
    • 在服务端(如Nginx、Node.js)动态替换M3U8文件中的路径。
    • 示例Nginx配置:
      1
      2
      3
      4
      5
      location /videos/ {
      sub_filter 'segment' 'https://cdn.example.com/videos/$1/segment';
      sub_filter_once off;
      sub_filter_types application/vnd.apple.mpegurl;
      }
    • 示例Node.js代码:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      const fs = require('fs');
      const http = require('http');

      http.createServer((req, res) => {
      const m3u8Content = fs.readFileSync('path/to/playlist.m3u8', 'utf8');
      const cdnBaseUrl = 'https://cdn.example.com/videos/123/720p/';
      const updatedContent = m3u8Content.replace(/(segment\d+\.ts)/g, cdnBaseUrl + '$1');
      res.setHeader('Content-Type', 'application/vnd.apple.mpegurl');
      res.end(updatedContent);
      }).listen(3000);
  • 优点:灵活,可根据请求动态调整CDN路径。

  • 缺点:增加服务端逻辑,可能影响性能。

方案三:使用CDN回源配置

  • 实现方式

    • 将M3U8文件和TS文件上传到源站(如云存储或服务器)。
    • 配置CDN回源到源站,客户端通过CDN访问M3U8和TS文件。
    • 无需修改M3U8文件中的路径,CDN会自动处理。
  • 优点:无需修改M3U8文件,CDN自动缓存和分发。

  • 缺点:依赖CDN的回源配置,可能增加源站压力。


3. CDN配置建议

回源设置

  • 将CDN的源站指向视频存储的云存储(如AWS S3、阿里云OSS)或服务器。
  • 确保源站能够正确响应M3U8和TS文件的请求。

缓存策略

  • M3U8文件
    • 缓存时间较短(如10秒),或设置为Cache-Control: no-cache
    • 确保客户端能够及时获取更新的M3U8文件。
  • TS文件
    • 缓存时间较长(如30天)。
    • 使用版本化文件名(如segment_v1.ts)避免缓存失效问题。

防盗链

  • 在CDN中启用Referer检查或Token验证,防止盗链。
  • 示例(阿里云CDN):
    • 配置Referer白名单。
    • 启用URL鉴权(如时间戳+MD5签名)。

4. 客户端访问流程

  1. 客户端请求主M3U8文件(如https://cdn.example.com/videos/123/master.m3u8)。
  2. CDN检查缓存,若未命中则回源获取。
  3. 客户端解析主M3U8文件,选择合适的分辨率子M3U8文件(如https://cdn.example.com/videos/123/720p/playlist.m3u8)。
  4. 客户端解析子M3U8文件,获取TS文件路径(如https://cdn.example.com/videos/123/720p/segment1.ts)。
  5. 客户端从CDN加载TS文件并播放。

5. 总结

  • M3U8文件路径调整
    • 推荐在转码时直接生成CDN路径(方案一),或通过服务端动态替换路径(方案二)。
    • 如果使用CDN回源(方案三),则无需调整M3U8文件路径。
  • CDN配置
    • 合理设置缓存策略,确保M3U8文件及时更新,TS文件长期缓存。
    • 启用防盗链功能,保护视频资源。
  • 性能优化
    • 结合CDN的全球节点分布,提升用户访问速度。
    • 监控CDN缓存命中率和回源流量,优化成本。