Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从curl获取youtube视频URL或获取视频信息_Php_Video_Youtube - Fatal编程技术网

Php 从curl获取youtube视频URL或获取视频信息

Php 从curl获取youtube视频URL或获取视频信息,php,video,youtube,Php,Video,Youtube,所以,我正在做一个php项目,其中一部分是抓取一个youtube视频url并将其插入html5视频标签中。我使用了一个curl调用,在本地机器上获得了正确的视频文件URL 但是,当我将代码上传到我的web服务器并尝试运行它时,所有视频URL都无法工作。URL看起来不错,但是一些参数,比如IP,在不同的地方。我不明白为什么它可以在运行xampp或mamp的本地机器上工作,但不能在我的web服务器上工作。我甚至试着在youtube视频页面上做一个卷曲,注意到在本地,它会输出页面并播放视频,但在我的W

所以,我正在做一个php项目,其中一部分是抓取一个youtube视频url并将其插入html5视频标签中。我使用了一个curl调用,在本地机器上获得了正确的视频文件URL

但是,当我将代码上传到我的web服务器并尝试运行它时,所有视频URL都无法工作。URL看起来不错,但是一些参数,比如IP,在不同的地方。我不明白为什么它可以在运行xampp或mamp的本地机器上工作,但不能在我的web服务器上工作。我甚至试着在youtube视频页面上做一个卷曲,注意到在本地,它会输出页面并播放视频,但在我的Web服务器上,所有视频调用都得到了404


有这方面的信息吗?无论如何,我可以抓取一个youtube视频url,这样我就可以在html5视频标签中播放youtube视频了?这就是keepvid和类似网站使用该死的java小程序的原因吗

你应该看看project,我相信你可以了解一下实现目标的正确方法。

最近我用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; 
    } 
}
?>

我希望它能帮助你


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

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

您可以使用以下代码下载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>";
?>

您只需从视频ID构建一个嵌入URL即可

这里最大的优点是,您可以根据需要向播放器添加自己的参数

例如,iframe src


{$video_id}?theme=light&autoplay=1&……

既然您得到了404,那么使用了什么URL?你可以发布一些获取信息和匹配数据的示例代码吗?YouTube不允许你这样做吗?它实际上是一个403,你可以在这个URL中看到它:如果YouTube不允许,那么为什么它在我的本地机器上工作,为什么他们有这个请求:注意,这是非法的,明确反对YT ToSOk,我只是检查和测试了一下,效果很好,但我想知道他们是怎么做到的。我不懂python,他们使用get_video_info吗?如果你不懂python,我想你知道或者;)好的,使用grep我看到他们确实使用了get_video_info,这与我的php代码非常相似。换句话说,它们提供的url在本地工作,但在服务器上不工作。由于文件确实在服务器上下载,我认为这是浏览器IP的问题。在本地,我的浏览器与本地计算机相同,但当我使用浏览器从服务器访问页面时,情况并非如此。因此,URL对于我的服务器是正确的,这就是它工作和下载的原因,但作为最终用户,该URL是不正确的。还有其他想法吗?您可能需要将其签名添加到第10行,
$y
从未使用过。我想你想为第11行写的是
$t[$n]=urldecode($v)
。或者更确切地说,
$table[$name]=urldecode($value)
,因为谁用枪指着你的头,迫使你使用糟糕的单字母变量名?我也使用过这种URL,但我无法让它返回比720p更高的质量。想得到1080p吗?它可以工作,但是有人在pascal/delphi中有类似的代码吗?