HLS流媒体初探
本文最后更新于 2025-02-11,墨迹未干时,知识正鲜活。随着时间推移,文章部分内容可能需要重新着墨,请您谅解。Contact
HLS 流媒体是什么?
AI详解:HLS(HTTP Live Streaming)是一种流式媒体传输协议,它的原理是将一个完整视频切分成许多小的视频片段(通常是几秒钟长的 .ts
文件),然后生成一个描述文件(.m3u8
文件)作为播放清单,播放器会根据这个清单去逐步加载和播放片段,从而实现边加载边播放。
优点:
- 支持在线播放。
- 如果网络条件较差,只加载需要的片段,不占用过多带宽。
- 可以适配多种设备。
准备工作
首先,在设备上安装了 FFmpeg
(我用的就是ubuntu服务器):
- 在 Ubuntu/Debian 上安装:
sudo apt update sudo apt install ffmpeg
- 在 CentOS/RHEL 上安装:
sudo yum install epel-release
sudo yum install ffmpeg ffmpeg-devel
- 在 Fedora 上安装:
sudo dnf install ffmpeg
- 在 macOS 上安装:
brew install ffmpeg
- 在 Windows 上安装:
- 访问 FFmpeg官网 或 FFmpeg Windows下载页面。
- 下载对应版本后把
ffmpeg.exe
所在的文件夹路径添加到系统的环境变量中,以便在终端中全局使用。
验证安装:
ffmpeg -version
显示版本信息,说明安装成功。
使用 FFmpeg 转换为 HLS 格式
运行以下 FFmpeg 命令:
ffmpeg -i movie.mp4 \
-codec: copy \
-start_number 0 \
-hls_time 10 \
-hls_list_size 0 \
-f hls movie.m3u8
参数说明:
-i movie.mp4
:输入文件名。-codec: copy
:不重新编码,直接复制原始数据。-start_number 0
:设置分段视频文件从0
开始命名。-hls_time 10
:设置每段视频的时长为 10 秒。-hls_list_size 0
:保存完整的.m3u8
播放清单(否则播放清单会自动裁剪为最新的部分)。-f hls movie.m3u8
:输出文件为 HLS 格式,文件名为movie.m3u8
。
在执行命令后,FFmpeg 会输出:
- 一个
movie.m3u8
文件(播放清单)。 - 若干个
movie0.ts
,movie1.ts
,movie2.ts
等小片段文件(每段约 10 秒长,通过.hls_time
参数控制时间片的长度)。
通过简易 HTTP 服务分享 HLS
将生成的 .m3u8
和 .ts
文件放置在一个文件夹中,通过 HTTP 文件服务器分享该文件夹。
方法一:使用 Python 搭建简单 HTTP 服务器
进入文件夹,运行以下命令:
python3 -m http.server 8000
HTTP 服务会在当前目录启动,可以通过浏览器访问:
http://<服务器IP>:8000/movie.m3u8
方法二:使用 NGINX 分享文件
服务端如果有NGINX
,可以通过配置静态目录来分享。
- 在
NGINX
配置文件中添加一行:location /movies/ { root /path/to/your/movie_folder; autoindex on; # 允许列出文件,便于调试 }
- 重新加载 NGINX:
sudo nginx -s reload
- 通过以下 URL 访问:
http://<服务器IP>/movies/movie.m3u8
播放 HLS 流媒体
方法一:HTML5 Video 播放器
生成的 .m3u8
文件可以直接用 HTML5 的 <video>
元素播放。例如:
<!DOCTYPE html>
<html>
<head>
<title>Stream a Movie</title>
</head>
<body>
<h1>HLS Movie</h1>
<video width="640" height="360" controls>
<source src="http://<服务器IP>:8000/movie.m3u8" type="application/x-mpegURL">
Your browser does not support HLS streaming.
</video>
</body>
</html>
将上述代码保存为一个 .html
文件,用浏览器打开即可播放。
方法二:用VLC 播放器
VLC 是一款支持 HLS 的免费播放器。
- 打开 VLC。
- 点击菜单栏的
Media -> Open Network Stream
。 - 输入
http://<服务器IP>:8000/movie.m3u8
,然后点击播放即可。
方法三:专业播放器
一些支持 HLS 协议的播放器,也可以通过访问 .m3u8
播放。
- Video.js: 网页播放器,支持 HLS。
- 支持
.m3u8
文件的 App 和设备,例如电视盒子。
(可选)实时转码(动态 HLS 流媒体)
适合电影格式不是 MP4 或需要转码为特定分辨率的情况,让 FFmpeg 实时转码并生成 HLS 流。参考命令:
ffmpeg -re -i movie.mp4 \
-vcodec libx264 -acodec aac \
-hls_time 10 \
-hls_list_size 0 \
-f hls movie.m3u8
使用 -vcodec
和 -acodec
参数指定视频和音频的编码器。
高级功能(支持多码率 HLS)
如果想根据网络情况选择清晰度,生成多种码率的 HLS 流,并生成主 m3u8
文件:
ffmpeg -i movie.mp4 -map 0:v -map 0:a \
-s 1920x1080 -b:v 5000k -hls_time 10 -f hls high/movie.m3u8 \
-s 1280x720 -b:v 3000k -hls_time 10 -f hls medium/movie.m3u8 \
-s 640x360 -b:v 1000k -hls_time 10 -f hls low/movie.m3u8
创建一个主文件:
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
high/movie.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3000000,RESOLUTION=1280x720
medium/movie.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360
low/movie.m3u8
总结
用FFmpeg
把视频文件转换为适合网络播放(流播)的 HLS 流媒体,再用HTTP 服务器进行分享,轻量好用。