我希望将YouTube视频转换为mp3并将其直接下载到访问者/用户的计算机上。
使用如下命令转换和下载到服务器非常简单:
youtube-dl --extract-audio --audio-format mp3 [video]
我想知道使用php将mp3文件发送到用户计算机的最快选择是什么。
答案 0 :(得分:0)
将歌曲(并将其转换为mp3)下载到服务器(进入可访问的文件夹),但将输出文件名称设置为youtube(https://youtube.com/watch?=IDENTIFIER)中的标识符。这样,当其他人想要相同的文件时,它不会两次下载相同的文件。 在PHP中,你可以这样得到它:
$link = $_GET['link']; // This is the Youtube link
$id = str_replace("https://youtube.com/watch?=", ""); // This will remove the youtube link itself
下载后,只需打印出文件的链接即可。
如果要节省带宽,请检查是否已存在具有相同标识符的文件。如果是,则只需向用户提供现有的。
希望这会有所帮助。 =)
答案 1 :(得分:0)
我正在为我的某个网站做同样的事情,我使用以下功能下载&将视频转换为mp3。它将视频链接作为参数并返回下载的文件位置。它还会检查文件是否已下载,如果是,则返回其位置。
function downloadMP3($videolink){
parse_str( parse_url( $videolink, PHP_URL_QUERY ), $parms );
$id = $parms['v'];
$output = "download/".$id.".mp3";
if (file_exists($output)) {
return $output;
}else {
$descriptorspec = array(
0 => array(
"pipe",
"r"
) , // stdin
1 => array(
"pipe",
"w"
) , // stdout
2 => array(
"pipe",
"w"
) , // stderr
);
$cmd = 'youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 --output download/"'.$id.'.%(ext)s" '.$videolink;
$process = proc_open($cmd, $descriptorspec, $pipes);
$errors = stream_get_contents($pipes[2]);
fclose($pipes[2]);
$ret = proc_close($process);
if ($errors) {
//print($errors);
}
return $output;
}
}
现在每当用户尝试下载文件时,我只需从$link = $_GET['link']
获取链接并将其传递给该函数,并使用以下代码来提供该文件:
$downloadpath = downloadMP3($videolink);
$song_name = "song";
header('X-Accel-Redirect: /' . $downloadpath);
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
header('Content-length: ' . filesize($_SERVER["DOCUMENT_ROOT"]."/".$downloadpath));
header('Content-Disposition: attachment; filename="'.$song_name.'.mp3"');
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
我强烈建议您使用Nginx的 X-Accel-Redirect 标头或Apache的 x-sendfile 来提供文件。