
在 PHP 中获取 HLS (HTTP Live Streaming) 流媒体信息,通常需要解析 HLS 播放列表文件(.m3u8
文件)。HLS 是由 Apple 提出的流媒体协议,通常用于直播流、点播视频等。其基本工作原理是将视频文件分割成多个小段,每个段对应一个 .ts
文件,这些文件被列在一个 .m3u8
播放列表中。
1. HLS 流媒体结构
.m3u8
文件:这是 HLS 播放列表文件,它包含了视频流的元数据,描述了视频片段(.ts
文件)的 URL 及播放顺序。.ts
文件:这些是视频片段文件,通常是 MPEG-TS 格式。
2. 获取 HLS 流媒体信息
要获取 HLS 流媒体的基本信息,主要是解析 .m3u8
文件,提取视频片段、比特率、分辨率等信息。你可以使用 PHP 来下载和解析 .m3u8
文件。
3. 步骤:使用 PHP 获取 HLS 流媒体信息
3.1 获取 .m3u8
文件
首先,我们需要下载 .m3u8
文件。可以通过 file_get_contents()
或 cURL 来实现。
<?php
// 目标 HLS 流的 .m3u8 文件 URL
$m3u8_url = "https://example.com/path/to/playlist.m3u8";
// 使用 file_get_contents 获取 .m3u8 文件内容
$m3u8_content = file_get_contents($m3u8_url);
if ($m3u8_content === false) {
die("无法获取 .m3u8 文件!");
}
// 输出 .m3u8 文件内容
echo nl2br(htmlspecialchars($m3u8_content));
?>
3.2 使用 cURL 获取 .m3u8
文件
如果需要更复杂的 HTTP 请求(如设置代理、超时等),可以使用 cURL。
<?php
// 目标 HLS 流的 .m3u8 文件 URL
$m3u8_url = "https://example.com/path/to/playlist.m3u8";
// 初始化 cURL 会话
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $m3u8_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 返回响应,而不是直接输出
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 如果发生重定向,跟随它
// 执行 cURL 请求并获取响应
$m3u8_content = curl_exec($ch);
// 检查请求是否成功
if ($m3u8_content === false) {
echo "cURL 错误: " . curl_error($ch);
} else {
// 输出获取的 .m3u8 文件内容
echo nl2br(htmlspecialchars($m3u8_content));
}
// 关闭 cURL 会话
curl_close($ch);
?>
3.3 解析 .m3u8
文件
一旦获取到 .m3u8
文件的内容,下一步就是解析它,提取其中的视频片段信息。一个基本的 .m3u8
文件通常包含多个 .ts
文件的 URL,以及一些元数据(如分辨率、比特率等)。
示例 .m3u8
内容(简化版):
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,RESOLUTION=640x360
http://example.com/video_360p.ts
#EXT-X-STREAM-INF:BANDWIDTH=2560000,RESOLUTION=1280x720
http://example.com/video_720p.ts
通过解析 .m3u8
文件中的每一行,可以提取每个视频段的 URL 和相关信息。
<?php
// 解析 m3u8 文件内容
function parseM3u8($m3u8_content) {
$video_info = [];
// 按行分割内容
$lines = explode("\n", $m3u8_content);
foreach ($lines as $line) {
// 过滤掉空行和注释
$line = trim($line);
if (empty($line) || strpos($line, '#') === 0) {
continue;
}
// 检查是否为 EXT-X-STREAM-INF 行(带有比特率和分辨率的元数据)
if (strpos($line, '#EXT-X-STREAM-INF') === 0) {
preg_match('/BANDWIDTH=(\d+),RESOLUTION=(\d+x\d+)/', $line, $matches);
if (isset($matches[1]) && isset($matches[2])) {
$bandwidth = $matches[1];
$resolution = $matches[2];
$video_info[] = [
'bandwidth' => $bandwidth,
'resolution' => $resolution,
];
}
}
// 检查是否为视频片段 URL
if (filter_var($line, FILTER_VALIDATE_URL)) {
$video_info[count($video_info) - 1]['url'] = $line; // 为最后一个视频流添加 URL
}
}
return $video_info;
}
// 获取 .m3u8 文件内容
$m3u8_content = file_get_contents("https://example.com/path/to/playlist.m3u8");
// 解析 .m3u8 内容
$video_info = parseM3u8($m3u8_content);
// 输出视频流信息
foreach ($video_info as $info) {
echo "分辨率: {$info['resolution']}, 带宽: {$info['bandwidth']} bps, URL: {$info['url']}\n";
}
?>
3.4 处理 HLS 播放列表的其他元数据
#EXT-X-STREAM-INF
:该标签描述了流的属性,如带宽(BANDWIDTH
)、分辨率(RESOLUTION
)、编解码器(CODECS
)等。#EXTINF
:描述每个媒体片段的持续时间。#EXT-X-TARGETDURATION
:定义每个.ts
片段的最大时长。
你可以根据需要提取更多的信息,进一步处理或展示给用户。
4. 获取 .ts
文件的详细信息
如果你需要获取 .ts
文件的更多信息,比如时长、大小等,可以使用其他工具(如 ffprobe
)来分析这些片段。你可以通过 PHP 调用外部程序(例如 ffmpeg
)来获取这些信息。
<?php
// 使用 ffprobe 获取 .ts 文件的详细信息
$ts_url = "http://example.com/video_360p.ts";
$command = "ffprobe -v error -show_format -show_streams $ts_url";
// 执行命令并获取输出
$output = shell_exec($command);
// 输出结果
echo "<pre>$output</pre>";
?>
5. 总结
在 PHP 中获取 HLS 流媒体信息的核心步骤:
- 获取
.m3u8
播放列表文件内容(使用file_get_contents()
或 cURL)。 - 解析
.m3u8
文件,提取出视频片段的 URL 和元数据信息。 - 根据需求,进一步分析
.ts
文件的细节(使用ffprobe
等工具)。 - 存储或展示获取到的信息。
你可以将这些信息用于视频流播放、监控、数据分析等应用。