本文最后更新于 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 上安装:
  1. 访问 FFmpeg官网FFmpeg Windows下载页面
  2. 下载对应版本后把 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,可以通过配置静态目录来分享。

  1. NGINX 配置文件中添加一行:
    location /movies/ {
        root /path/to/your/movie_folder;
        autoindex on; # 允许列出文件,便于调试
    }
    
  2. 重新加载 NGINX:
    sudo nginx -s reload
    
  3. 通过以下 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 的免费播放器。

  1. 打开 VLC。
  2. 点击菜单栏的 Media -> Open Network Stream
  3. 输入 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 服务器进行分享,轻量好用。