从curl或get_video_info获取youtube视频网址

时间:2011-11-29 20:21:11

标签: php video youtube

所以,我正在开发一个php项目,其中一部分是抓取一个youtube视频网址并将其插入到html5视频标签中。我正在使用curl调用http://youtube.com/get_video_info?video_id=XXX并在我的本地计算机上获取正确的视频文件网址。

但是,当我将我的代码上传到我的网络服务器并试图运行它时,没有一个视频网址有效。网址似乎很好,但有些参数,如IP,不同。我无法理解为什么它可以在运行xampp或mamp的本地计算机上运行,​​但不能在我的Web服务器上运行。我甚至尝试在youtube视频页面上做一个卷曲,并注意到在本地,它会输出页面并播放视频,但在我的网络服务器上,所有视频通话都得到404.

有关此信息吗?无论如何,我可以获取YouTube视频网址,以便我可以在html5视频标签中播放youtube视频?这就是为什么keepvid和这样的网站使用该死的java小程序?

5 个答案:

答案 0 :(得分:10)

你应该看看youtube-dl项目我非常确定你能够理解正确的方法来实现你的目标。

答案 1 :(得分:6)

我已经用PHP编写了一个脚本来将youtube视频最近传输到clinets,我认为通过改变我的脚本可以满足你的目的。

这是我的PHP脚本:

<?php 
@set_time_limit(0); //disable time limit to make sure the whole video is streamed to the client
$id = $_GET['id']; //the youtube video ID
$type = $_GET['type']; //the MIME type of the desired format

parse_str(file_get_contents('http://www.youtube.com/get_video_info?video_id='.$id),$info); //get video info
$streams = explode(',',$info['url_encoded_fmt_stream_map']); //split the stream map into streams

foreach($streams as $stream){ 
    parse_str($stream,$real_stream); //parse the splitted stream
    $stype = $real_stream['type']; //the MIME type of the stream
    if(strpos($real_stream['type'],';') !== false){ //if a semicolon exists, that means the MIME type has a codec in it
        $tmp = explode(';',$real_stream['type']); //get rid of the codec
        $stype = $tmp[0]; 
        unset($tmp); 
    } 
    if($stype == $type && ($real_stream['quality'] == 'large' || $real_stream['quality'] == 'medium' || $real_stream['quality'] == 'small')){ //check whether the format is the desired format 
        header('Content-type: '.$stype); //send the HTTP headers
        header('Transfer-encoding: chunked'); //necessary for streaming
        @readfile($real_stream['url'].'&signature='.$real_stream['sig']); //send the content to the client
        ob_flush(); //disable PHP caching
        flush(); //flush the content out
        break; 
    } 
}
?>

我希望它可以帮到你。

P.S。您需要从服务器发送内容,因为视频URL因ISP而异。

答案 2 :(得分:2)

您提取的链接仅适用于您从中提取的IP地址。因此,如果您从本地计算机中提取它,它将在您的计算机上的浏览器中运行。但是,如果从服务器中提取它,则只有服务器才能从该链接访问视频文件。

答案 3 :(得分:1)

您可以使用此代码下载YouTube视频:

<?php
$id='5HDw7sQE2H0';
$dt=file_get_contents("http://www.youtube.com/get_video_info?video_id=$id&el=embedded&ps=default&eurl=&gl=US&hl=en");
$x=explode("&",$dt);
$t=array(); $g=array(); $h=array();
echo "<pre>\r\n";
foreach($x as $r){
    $c=explode("=",$r);
    $n=$c[0]; $v=$c[1];
    $y=urldecode($v);
    $t[$n]=$v;
}
$streams = explode(',',urldecode($t['url_encoded_fmt_stream_map']));
foreach($streams as $dt){ 
    $x=explode("&",$dt);
    foreach($x as $r){
        $c=explode("=",$r);
        $n=$c[0]; $v=$c[1];
        $h[$n]=urldecode($v);
    }
    $g[]=$h;
}
print_r($g);
echo "\r\n</pre>";
?>

答案 4 :(得分:0)

您只需根据视频ID

构建嵌入网址即可

这里的一大优势是您可以根据需要将自己的参数添加到播放器。

例如iframe src,

http://www.youtube.com/embed/ {$ VIDEO_ID}主题=光&安培;自动播放= 1&安培; ...