2014-05-16 65 views
3

任何人都可以告訴我如何在PHP我可以得到不同的比特率(分辨率)sub m3u8網址,如果我們有主播表m3u8使用get_data方法?以下是我從get_data方法獲得的數據,但我想要爲每個網址獲取m3u8網址解析度。任何人都可以告訴我如何做到這一點?提前致謝。如何解析m3u8並獲得不同bitttrate sub m3u8 url?

$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:

#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 
+0

他們只是字符串,所以...基本的字符串操作,可能是一個明智的'explode()'和whatnot。 –

回答

3

首先,你需要獲取數據源,然後對其進行處理(explode()的值,如您的樣本數據是換行),然後由兩個小組他們,最終他們循環。考慮下面這個例子:

<?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 

?> 

格式化件應該是這個樣子:

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環和他們,和循環過程中的鏈接:

<?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標記現在應該看起來像這樣:

<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> 
+0

謝謝,但我不能讓它工作。我試圖回顯$件以查看這些行是否在arrray中分組,但沒有輸出! – user1788736

+0

@ user1788736我很難猜測如何解析來自curl的數據(可能是'\ n'或'\ r \ n'),但如果它只是字符串,那麼您可以修改答案以適應它相應的數據,你有 – user1978142

+0

kevinabelita我成功地分組陣列。只有我不知道如何運行你的代碼的最後部分(每個)。你能檢查那部分有一些回聲想念嗎? – user1788736

0

如果我理解正確的quetion你需要解析字符串,並得到解決。

function findResolution($string){ 
    $array = explode(",",$string); 
    foreach ($array as $item){ 
     if (strpos($item,"RESOLUTION")!==false){ 
      return str_replace("RESOLUTION=","",$item); 
     } 
    } 
} 
+0

感謝您的回覆。我想輸出分辨率值和它後面的網址。你能告訴我如何?我想爲每個不同的分辨率創建超鏈接 – user1788736

0

爲什麼不fopen/fgets?

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密鑰的陣列,用於原始文件中的每個迭代。