在使用CDN配合的情况下,转码后的M3U8文件中的TS路径需要根据CDN的配置进行调整,以确保客户端能够正确从CDN节点加载视频片段(TS文件)。以下是具体的设计和调整方案:
1. M3U8文件中的TS路径调整
原始M3U8文件示例
假设转码后生成的M3U8文件内容如下:
1 | #EXTM3U |
子M3U8文件(如720p/playlist.m3u8)内容:
1 | #EXTM3U |
调整后的M3U8文件
为了让客户端从CDN加载TS文件,需要将TS路径替换为CDN的完整URL。例如:
1 | #EXTM3U |
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
5location /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
10const 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文件。
- 缓存时间较短(如10秒),或设置为
- TS文件:
- 缓存时间较长(如30天)。
- 使用版本化文件名(如
segment_v1.ts)避免缓存失效问题。
防盗链
- 在CDN中启用Referer检查或Token验证,防止盗链。
- 示例(阿里云CDN):
- 配置Referer白名单。
- 启用URL鉴权(如时间戳+MD5签名)。
4. 客户端访问流程
- 客户端请求主M3U8文件(如
https://cdn.example.com/videos/123/master.m3u8)。 - CDN检查缓存,若未命中则回源获取。
- 客户端解析主M3U8文件,选择合适的分辨率子M3U8文件(如
https://cdn.example.com/videos/123/720p/playlist.m3u8)。 - 客户端解析子M3U8文件,获取TS文件路径(如
https://cdn.example.com/videos/123/720p/segment1.ts)。 - 客户端从CDN加载TS文件并播放。
5. 总结
- M3U8文件路径调整:
- 推荐在转码时直接生成CDN路径(方案一),或通过服务端动态替换路径(方案二)。
- 如果使用CDN回源(方案三),则无需调整M3U8文件路径。
- CDN配置:
- 合理设置缓存策略,确保M3U8文件及时更新,TS文件长期缓存。
- 启用防盗链功能,保护视频资源。
- 性能优化:
- 结合CDN的全球节点分布,提升用户访问速度。
- 监控CDN缓存命中率和回源流量,优化成本。