来自远程服务器的php流文件

Posted

技术标签:

【中文标题】来自远程服务器的php流文件【英文标题】:php stream file from remote server 【发布时间】:2015-08-12 08:03:32 【问题描述】:

假设我在远程服务器上有一个视频,这是它的 url

“http://domain/video-path/video.mp4”

使用能够将视频向后或向前移动的 php 流式传输此视频的正确方法是什么。

我知道如何使用 fopenfread 函数流式传输视频,但我希望播放器(html5 播放器)缓存视频,以便客户端可以将其向前或向后移动 .. 感谢并为我的错误感到抱歉英文。

【问题讨论】:

试试这个:codesamplez.com/programming/php-html5-video-streaming-tutorial 为什么要代理服务器上的视频? 我有一个小型网络 .. 我不希望计算机直接连接到互联网,我只想允许来自 youtube 的一些视频 .. 所以我想从互联网并将其流式传输到其他计算机并将此视频保存到服务器硬盘驱动器以便下次更快地流式传输.. 我可以做到我的意思是我可以从互联网获取视频并将其流式传输到另一台计算机并保存到服务器硬盘 .. 一切正常,但客户端无法将视频向后或向前移动。我知道我可以使用像 squid 这样的代理服务器,但我想通过 php 来实现 .. 我会检查你的链接..谢谢你的帮助 不幸的是,此类用于流式传输本地文件而不是远程文件.. 流式传输本地文件很容易,但 fseek 使用远程文件 fseek() 返回此错误:流不支持搜索 【参考方案1】:

很晚才回答

$remoteFile = 'blabla.com/video5GB.mp4';
play($remoteFile);

function play($url)
    ini_set('memory_limit', '1024M');
    set_time_limit(3600);
    ob_start();
    if (isset($_SERVER['HTTP_RANGE'])) $opts['http']['header'] = "Range: " . $_SERVER['HTTP_RANGE'];
    $opts['http']['method'] = "HEAD";
    $conh = stream_context_create($opts);
    $opts['http']['method'] = "GET";
    $cong = stream_context_create($opts);
    $out[] = file_get_contents($url, false, $conh);
    $out[] = $httap_response_header;
    ob_end_clean();
    array_map("header", $http_response_header);
    readfile($url, false, $cong);

【讨论】:

$httap_response_header$http_response_header 是未定义的变量【参考方案2】:

不知道您是否可以按照您描述的方式在 PHP 中执行此操作。

假设我们有这个 HTML:

<video   controls>
    <source src="playmymovie.php?url=http://domain/video-path/video.mp4" type="video/mp4">
    Your browser does not support the video tag.
</video>

所以现在我们必须创建一个 PHP 页面来处理这个问题(参见 Using php to output an mp4 video):

<?php
$vid_url = isset($_GET['url'])?$_GET['url']:"";
if(empty($vid_url))
    // trigger 404
    header("HTTP/1.0 404 Not Found");
 else 
    // Get Video

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $vid_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 0);
    $out = curl_exec($ch);
    curl_close($ch);

    // Set header for mp4
    header('Content-type: video/mp4');
    header('Content-type: video/mpeg');
    header('Content-disposition: inline');
    header("Content-Transfer-Encoding:­ binary");
    header("Content-Length: ".filesize($out));

    // Pass video data
    echo $out;

exit();
?>

如果是我,我会先测试 URL,确保您获得 200 状态,然后再尝试将其传回。您还可以触发正确的状态,以便浏览器知道发生了什么并提醒用户(或您)。

【讨论】:

实际上我的问题不在于如何流式传输视频 .. 我的问题是如何流式传输具有向后或向前移动视频的能力的视频 .. 这似乎是不可能的,因为 fseek功能不支持远程文件,它仅适用于本地文件..所以我现在正在搜索关于在写入时流式传输视频..我将制作一个脚本以将其下载到我的服务器和其他脚本以在写入时对其进行流式传输。无论如何感谢您的帮助,我希望您能理解我的意思 也许你可以在浏览器中强制缓存,这样浏览器至少可以倒带:***.com/questions/5111382/… 这可能对你有用:***.com/questions/15797762/reading-mp4-files-with-php 谢谢你,但不可能做到这一点.. 我使用了另一种解决方案.. 一个文件下载视频,另一个文件在我的服务器上写入视频时进行流式传输......所以现在我可以在流文件中使用 fseek 。

以上是关于来自远程服务器的php流文件的主要内容,如果未能解决你的问题,请参考以下文章

来自远程服务器的 Netbeans PHP 应用程序 - 问题

如何检测远程服务器的 IP?

来自远程服务器的 jQuery 文件树

Ruby读远程文件流

PHP下载远程文件

使用 Web Audio API 和 Wrtc 进行远程音频处理