2011-11-29 277 views
8

因此,我正在开发一个php项目,其中一部分是抓取YouTube视频网址并将其插入到html5视频标记中。我正在使用卷曲电话拨打http://youtube.com/get_video_info?video_id=XXX,并在本地计算机上获取正确的视频文件网址。从curl或get_video_info获取YouTube视频网址

但是,当我将我的代码上传到我的Web服务器并尝试运行它时,没有任何视频URL可以正常工作。网址似乎很好,但一些参数,如IP,其中不同。我不明白为什么它从我的本地机器上运行xampp或mamp而不是在我的web服务器上。我甚至试着在YouTube视频页面上做一个卷曲,并注意到在本地,它会输出页面并播放视频,但在我的网络服务器上,所有视频通话都获得了404s。

有关这方面的任何信息?无论如何,我可以抓住YouTube视频网址,以便我可以在html5视频标签中播放youtube视频?这就是为什么keepvid和类似的网站使用该死的Java小程序?

+0

既然你得到404,使用的是什么网址?你可以发布一些示例代码来获取信息和匹配数据吗? – drew010

+0

YouTube不允许你这样做吗? –

+0

它实际上是一个403,你可以在这个URL中看到它:http://oo.preferred.iad09s12.v5.lscache8.c.youtube.com/videoplayback?sparams=id,expire,ip,ipbits,itag,source ,ratebypass,CP&FEXP = 907911,914060,916201&ITAG = 43&IP = 208.0.0.0&签名= 1810EA75ADD7E30581426A5262C030CF82348A98。5C2D5385C0DD8FCFCF46EF43BD7223C894825DB6&sver = 3&ratebypass = YES&源= YouTube和到期= 1322629200&键= YT1&ipbits = 8&CP = U0hRR1ZNV19FSkNOMV9OR0FDOlBIZnZ0Zl9jdXNF&ID = 1c8acc21e379b6d1和质量=培养基fallback_host = tc.v5.cache8.c.youtube.com&类型=视频/ WEBM – iwek

回答

-3

也许刮YouTube是不是一个好主意,你应该看看官方的API: http://code.google.com/apis/youtube/overview.html

“数据API”看来你需要什么。

+1

YouTube API是我首先看的地方,我也没有看到它们提供的方式检索视频文件的URL http://youtube.com/get_video_info?video_id=XXX – iwek

10

您应该看看youtube-dl项目我敢肯定,您可以通过一些想法了解实现目标的正确方法。

+0

好吧,我刚刚检查过它并测试它,它工作的很好,但我不知道他们是如何做到的。我不知道Python,他们使用get_video_info? – iwek

+0

如果你不知道Python,我想你知道[grep](http://en.wikipedia.org/wiki/Grep)或[ack](http://betterthangrep.com/);) –

+0

好的,使用grep我看到他们使用get_video_info,它非常类似于我的PHP代码。换句话说,他们提供的url在本地工作,但不在服务器上。由于该文件确实在服务器上下载,我认为这是浏览器IP的问题。本地我的浏览器与本地机器相同,但当我使用浏览器从我的服务器上打开页面时,情况并非如此。所以,我的服务器的URL是正确的,这就是为什么它的工作原理和下载,但作为最终用户,该网址是不正确的。任何其他想法? – iwek

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而异。

+0

它的工作原理,但任何人都有类似的代码在pascal /德尔福? – Artem

2

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

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>"; 
?> 
+1

上述代码不再有效。 – Hassaan

+0

您可能需要添加签名才能使用 – LZH

+0

在第10行中,从不使用'$ y'。我认为你为第11行写的意思是'$ t [$ n] = urldecode($ v)'。或者说,'$ table [$ name] = urldecode($ value)',会让你有一把枪,迫使你使用可怕的单字母变量名? –

0

你可以简单地从视频ID建立一个嵌入URL

这里最大的好处是,你可以添加自己的参数到球员根据需要。

例如一个IFRAME SRC,

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