所以,我正在开发一个php项目,其中一部分是抓取一个youtube视频网址并将其插入到html5视频标签中。我正在使用curl调用http://youtube.com/get_video_info?video_id=XXX并在我的本地计算机上获取正确的视频文件网址。
但是,当我将我的代码上传到我的网络服务器并试图运行它时,没有一个视频网址有效。网址似乎很好,但有些参数,如IP,不同。我无法理解为什么它可以在运行xampp或mamp的本地计算机上运行,但不能在我的Web服务器上运行。我甚至尝试在youtube视频页面上做一个卷曲,并注意到在本地,它会输出页面并播放视频,但在我的网络服务器上,所有视频通话都得到404.
有关此信息吗?无论如何,我可以获取YouTube视频网址,以便我可以在html5视频标签中播放youtube视频?这就是为什么keepvid和这样的网站使用该死的java小程序?
答案 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&安培; ...