在 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 流媒体信息的核心步骤:

  1. 获取 .m3u8 播放列表文件内容(使用 file_get_contents() 或 cURL)。
  2. 解析 .m3u8 文件,提取出视频片段的 URL 和元数据信息。
  3. 根据需求,进一步分析 .ts 文件的细节(使用 ffprobe 等工具)。
  4. 存储或展示获取到的信息。

你可以将这些信息用于视频流播放、监控、数据分析等应用。