Php 将YouTube视频文件直接下载到用户';通过浏览器访问计算机

Php 将YouTube视频文件直接下载到用户';通过浏览器访问计算机,php,youtube,tcp-ip,Php,Youtube,Tcp Ip,当我运行此文件时,首先使用YouTube dl.exe将相应的YouTube视频下载到该PHP文件所在的localhost服务器文件夹,然后将其从该文件夹推送到浏览器下载(强制下载) 如何直接开始下载到用户的浏览器 此外,文件在本地主机上运行正常,但在远程服务器上运行不正常。问题可能出在:shell\u exec(“youtube-dl.exe$youtubeUrl”) 首先,一些主机出于安全原因禁用shell_exec 其次,youtube-dl.exe看起来可能是一个windows脚本,因为

当我运行此文件时,首先使用
YouTube dl.exe将相应的YouTube视频下载到该PHP文件所在的localhost服务器文件夹,然后将其从该文件夹推送到浏览器下载(强制下载)

如何直接开始下载到用户的浏览器


此外,文件在本地主机上运行正常,但在远程服务器上运行不正常。

问题可能出在:
shell\u exec(“youtube-dl.exe$youtubeUrl”)

首先,一些主机出于安全原因禁用shell_exec


其次,youtube-dl.exe看起来可能是一个windows脚本,因为您的远程服务器可能是基于Linux的。

首先,您需要使用youtube dl版本作为Web服务器的平台。youtube dl.exe
是为Windows构建的,而大多数网络主机使用Linux

然后使用PHP函数运行带有的
youtube dl
。参数使
youtube dl
将下载的视频输出到其标准输出,而
passthru
将标准输出传递到浏览器

您还需要在
passthru
之前输出标题。请注意,在这种情况下,您无法知道下载大小

<?php
$youtubeUrl =  "https://www.youtube.com/watch?v=Ko2JcxecV2E"; 
$content = json_encode ($file = shell_exec("youtube-dl.exe $youtubeUrl "));
$input_string =$content;
$regex_pattern = "/Destination:(.*.mp4)/";
$boolean = preg_match($regex_pattern, $input_string, $matches_out);
$extracted_string=$matches_out[0];

$file =explode(': ',$extracted_string,2)[1];      

// Quick check to verify that the file exists
if( !file_exists($file) ) die("File not found");
// Force the download
header("Content-Disposition: attachment; filename=\"$file\"" );
header("Content-Length: " . filesize($file));
header("Content-Type: application/octet-stream;");
readfile($file);

?>
如果需要视频元数据(如文件名),可以首先使用
-j
命令行参数运行
youtube dl
,以获取JSON数据,而无需下载视频


此外,您还需要1)web服务器上的Python解释器2)能够通过PHP脚本使用
passthru
功能3)连接YouTube。所有这些通常都限制在网络主机上。

问题是什么?当
youtube dl.exe
开始下载文件时,您想让PHP代码立即开始将文件流式传输到浏览器,而不等待下载完成吗?是的,有点。。。。但不是流媒体。在浏览器中下载shlould start而不是Streaming一个问题,你接受了Martin Prikryl的答案什么对我也适用,但如何在客户端创建mp4文件?这有点超出了这个问题的范围,但文档似乎相当全面,取决于你想做什么:
header("Content-Disposition: attachment; filename=\"...\"" );
header("Content-Type: application/octet-stream");

passthru("youtube-dl -o - $youtubeUrl");