
本文介绍如何通过 FFmpeg 工具链将任意 HTTP 视频链接(如 MP4、MOV 等)转封装或转码生成标准 HLS(HTTP Live Streaming)格式的 .m3u8 播放列表及对应分片文件,适用于网页/移动端自适应流媒体播放。
本文介绍如何通过 ffmpeg 工具链将任意 http 视频链接(如 mp4、mov 等)转封装或转码生成标准 hls(http live streaming)格式的 `.m3u8` 播放列表及对应分片文件,适用于网页/移动端自适应流媒体播放。
将一个普通视频 URL(例如 https://example.com/video.mp4)直接“转换为 m3u8 文件”,本质上并非简单重命名,而是需下载源视频并按 HLS 协议规范进行切片与索引生成。M3U8 是 HLS 的播放列表文本文件,必须配合 .ts(MPEG-TS)分片文件才能正常播放。
✅ 基础实现:使用 FFmpeg 命令行
确保已安装 FFmpeg(v4.3+ 推荐),然后执行以下命令:
# 下载并实时转码生成 HLS(推荐用于非直播场景) ffmpeg -i "https://example.com/video.mp4" \ -codec: copy -start_number 0 -hls_time 10 -hls_list_size 0 \ -f hls -hls_segment_filename "segment_%03d.ts" output.m3u8
-
-codec: copy:启用流拷贝(无损、快速),要求源格式兼容 HLS(如 H.264+AAC 的 MP4); -
-hls_time 10:每个.ts分片时长为 10 秒; -
-hls_list_size 0:保留全部分片(不滚动删除); -
output.m3u8及生成的segment_001.ts,segment_002.ts等需同目录部署于 Web 服务器(如 Nginx/Apache),才能被正确加载。
⚠️ 注意:若源视频编码不兼容(如 VP9、AV1、无音频),需显式转码:
ffmpeg -i "https://example.com/video.mp4" \ -c:v libx264 -c:a aac -b:v 1000k -b:a 128k \ -hls_time 6 -hls_playlist_type vod -f hls output.m3u8
? 开发集成方案(PHP 示例)
对于 Web 应用,推荐使用成熟的封装库降低复杂度。PHP-FFmpeg-video-streaming 提供了面向对象的 HLS 生成接口:
use Streaming\HLS;
use Streaming\FFMpeg;
$ffmpeg = new FFMpeg();
$hls = new HLS($ffmpeg);
$hls->setInput('https://example.com/video.mp4')
->setHlsTime(10)
->setHlsListSize(0)
->setOutputDir('/var/www/hls/')
->setHlsSegmentFilename('seg_%03d.ts')
->generate(); // 输出 /var/www/hls/output.m3u8 + 分片文件
// 前端可直接访问:https://yoursite.com/hls/output.m3u8
该库自动处理路径、权限、错误回调,并支持多码率自适应(ABR)进阶功能。
? 关键注意事项
-
网络可达性:FFmpeg 需能直连视频源链接(部分平台防盗链需加
-headers "Referer: https://xxx.com"); -
存储与权限:输出目录需有写入权限,且
.m3u8和.ts文件须通过 HTTP 可公开访问; -
CORS 与 MIME 类型:Web 服务器需配置
Access-Control-Allow-Origin: *及正确 MIME(.m3u8 → application/vnd.apple.mpegurl,.ts → video/MP2T); -
非实时性:此为点播(VOD)方案;如需直播推流,应使用
ffmpeg -i rtmp://... -f hls ...并配合持续输入源。
掌握 FFmpeg 的 HLS 参数逻辑与工程化封装,即可稳定产出符合标准的流媒体资源——无需第三方服务,完全自主可控。











