首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解析m3u8并得到不同的比特子m3u8 urls?

如何解析m3u8并得到不同的比特子m3u8 urls?
EN

Stack Overflow用户
提问于 2014-05-16 19:16:23
回答 3查看 9.7K关注 0票数 3

有谁能告诉我在php中,如果我们使用m3u8方法获得主播放列表m3u8,如何获得不同的比特率(分辨率)子get_data urls ?下面是来自get_data方法的数据,但我希望获得每个分辨率的m3u8 urls。有人能告诉我怎么做吗?谢谢。

代码语言:javascript
运行
复制
$returned_content = get_data(''.$m3u8Url);
/* gets the data from a URL */
function get_data($url) {
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

主要播放列表m3u8:

代码语言:javascript
运行
复制
  #EXTM3U
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1628000,RESOLUTION=852x480,CODECS="avc1.77.30,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/erewewrwrtf34324343443243434344/test1.mpegts/playlist-dfasdfasdfaw4q3243241.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=128000,RESOLUTION=256x144,CODECS="avc1.66.30,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/fgdhgfhgjhghfdsdf45454545345435/test1.mpegts/playlist-adfdfghgjdt5t45454542.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=464000,RESOLUTION=426x240,CODECS="avc1.77.30,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/764563564565445fsdf4r3dfdfdffdf/test1.mpegts/playlist-eertyeryry564534rrtr3.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=828000,RESOLUTION=640x360,CODECS="avc1.77.30,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/fgsfdgdfgfdg5435345456745264554/test1.mpegts/playlist-fgsfghdghjt4353454544.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2128000,RESOLUTION=1024x576,CODECS="avc1.77.30,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/sfdgsdfgfdgfdgfdgfd465436546576/test1.mpegts/playlist-fghdjhygjujdfgsaf4455.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3692000,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/sfdghgjyuktyurty546565466453645/test1.mpegts/playlist-safdghhgfjjyj45345546.m3u8
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-17 00:11:02

首先,您需要获取数据源,然后处理它们(explode()值,因为您的示例数据处于换行状态),然后将它们按两个值分组,并在最后循环它们。考虑一下这个例子:

代码语言:javascript
运行
复制
<?php

$curl_output = '#EXTM3U
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1628000,RESOLUTION=852x480,CODECS="avc1.77.30,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/erewewrwrtf34324343443243434344/test1.mpegts/playlist-dfasdfasdfaw4q3243241.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=128000,RESOLUTION=256x144,CODECS="avc1.66.30,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/fgdhgfhgjhghfdsdf45454545345435/test1.mpegts/playlist-adfdfghgjdt5t45454542.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=464000,RESOLUTION=426x240,CODECS="avc1.77.30,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/764563564565445fsdf4r3dfdfdffdf/test1.mpegts/playlist-eertyeryry564534rrtr3.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=828000,RESOLUTION=640x360,CODECS="avc1.77.30,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/fgsfdgdfgfdg5435345456745264554/test1.mpegts/playlist-fgsfghdghjt4353454544.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2128000,RESOLUTION=1024x576,CODECS="avc1.77.30,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/sfdgsdfgfdgfdgfdgfd465436546576/test1.mpegts/playlist-fghdjhygjujdfgsaf4455.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3692000,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.2"
    http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/sfdghgjyuktyurty546565466453645/test1.mpegts/playlist-safdghhgfjjyj45345546.m3u8';

// process the string
$pieces = explode("\n", $curl_output); // make an array out of curl return value
unset($pieces[0]); // remove #EXTM3U
$pieces = array_map('trim', $pieces); // remove unnecessary space
$pieces = array_chunk($pieces, 2); // group them by two's

?>

格式化的片段应该如下所示:

代码语言:javascript
运行
复制
Array
(
    [0] => Array
    (
        [0] => #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1628000,RESOLUTION=852x480,CODECS="avc1.77.30,mp4a.40.2"
        [1] => http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/erewewrwrtf34324343443243434344/test1.mpegts/playlist-dfasdfasdfaw4q3243241.m3u8
    )

    [1] => Array
    (
        [0] => #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=128000,RESOLUTION=256x144,CODECS="avc1.66.30,mp4a.40.2"
        [1] => http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/fgdhgfhgjhghfdsdf45454545345435/test1.mpegts/playlist-adfdfghgjdt5t45454542.m3u8
    )
    ...

然后,在html循环和它们上,在循环内部处理链接:

代码语言:javascript
运行
复制
<?php foreach($pieces as $key => $value): ?>
    <a href="<?php echo $value[1]; ?>">Watch this in 
        <?php
        $value[0] = explode(',', $value[0]);
        foreach($value[0] as $index => $element) {
            if(stripos($element, 'RESOLUTION') !== false) {
                echo $element;
            }
        }
        ?>
    </a><br/>
<?php endforeach; ?>

HTML标记现在应该如下所示:

代码语言:javascript
运行
复制
<a href="http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/erewewrwrtf34324343443243434344/test1.mpegts/playlist-dfasdfasdfaw4q3243241.m3u8">Watch this in 
    RESOLUTION=852x480  </a>
<a href="http://me.mysite.com/media/l3/ertetertyrtut34534234324f3esrere/fgdhgfhgjhghfdsdf45454545345435/test1.mpegts/playlist-adfdfghgjdt5t45454542.m3u8">Watch this in 
    RESOLUTION=256x144  </a>
票数 3
EN

Stack Overflow用户

发布于 2014-05-16 19:32:13

如果我正确地理解了这个等式,那么您需要解析一个字符串并获得解析。

代码语言:javascript
运行
复制
function findResolution($string){
    $array = explode(",",$string);
    foreach ($array as $item){
        if (strpos($item,"RESOLUTION")!==false){
            return str_replace("RESOLUTION=","",$item);
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-03-12 22:29:33

为什么不开诚布公?

代码语言:javascript
运行
复制
function parseHLS($file) {
    $return = array();
    $i = 0;
    $handle = fopen($file, "r");
    if($handle) {
        while(($line = fgets($handle)) !== FALSE) {
            if(strpos($line,"EXT-X-STREAM-INF") !== FALSE) {
                if ($c=preg_match_all ("/.*?(BANDWIDTH)(.*?)(,)(RESOLUTION)(.*?)(,)/is", $line, $matches)) {
                    $return['data'][$i]['bandwidth'] = str_replace("=","",$matches[2][0]);
                    $return['data'][$i]['resolution'] = str_replace("=","",$matches[5][0]);
                }
            }
            if(strpos($line,".ts") !== FALSE) {
                $return['data'][$i]['url'] = str_replace(array("\r","\n"),"",$line);
                $i++;
            }
        }
        fclose($handle);
    }
    return $return;
}

这将为原始文件中的每个迭代获得一个具有带宽、分辨率和url键的数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23703012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档