PHP 离线下载M3U8等其他格式合成Mp4 依赖FFMPEG
PHP
//各位大哥能不能讲点武德?转载就转载了,你留个源网址行不行?
//Myfpga 版权所有
<?php
$url= $_GET["url"];
$name = $_GET["name"];
$web = $_GET["web"];
$psw = $_GET["psw"];
$dir = getcwd().'/movies/'; #获取Movies目录
#获取参数
$timenow = date('YmdHis');#获取现在时间
if(empty($name))#如果没有指定文件名,则以时间命名
{
$name = $timenow;
}
if(!empty($url)) #如果输入了视频地址,则直接下载转码
{
$cmd = 'cd '.$dir.' && ffmpeg -i '.$url.' -vcodec copy -acodec copy -absf aac_adtstoasc '.$name.'.mp4';
}
elseif(!empty($name))#输入了网页,则解析视频地址
{
$info=file_get_contents($web);
preg_match('/[a-zA-z]+:[^\s]*(\.webm|\.m3u8|\.avi)/', $info, $demin);
if(!empty($demin[0])) #如果成功获取了视频地址
{
$cmd = 'cd '.$dir.' && ffmpeg -i '.$demin[0].' -vcodec copy -acodec copy -absf aac_adtstoasc '.$name.'.mp4';
}
else #如果没有获取地址则返回404
{
header('HTTP/1.1 404 Not Found');
header("status: 404 Not Found");
}
}
if(empty($psw)) #如果输入了视频地址,则直接下载转码
{
$psw = 123456;
}
$jiami = '&&zip -mD --password '.$psw.' '.$timenow.' '.$name.'.mp4'; #对下载的视频压缩加密
$cmd=$cmd.$jiami;
if(!empty($url)||!empty($web)){
shell_exec($cmd); #开始下载
$file_dir = $dir;
$file_name = $timenow.'.zip';
if (! file_exists ( $file_dir . $file_name )) {
header('HTTP/1.1 404 NOT FOUND');
} else {
//以只读和二进制模式打开文件
$file = fopen ( $file_dir . $file_name, "rb" );
//告诉浏览器这是一个文件流格式的文件
Header ( "Content-type: application/octet-stream" );
//请求范围的度量单位
Header ( "Accept-Ranges: bytes" );
//Content-Length是指定包含于请求或响应中数据的字节长度
Header ( "Accept-Length: " . filesize ( $file_dir . $file_name ) );
//用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
Header ( "Content-Disposition: attachment; filename=" . $file_name );
//读取文件内容并直接输出到浏览器
echo fread ( $file, filesize ( $file_dir . $file_name ) );
fclose ( $file );
exit ();
}
}
else{
header('HTTP/1.1 404 Not Found');
header("status: 404 Not Found");
}
exit;
?>
请根据提示的报错信息,前往PHP的config修改放行相关函数,如
PHP
shell_exec
请修改流内存限制,否则默认的是60Mb,导致下载失败,也可以自行修改代码,不使用流的方式发送文件,改成
PHP
header('Location: ./movies/'.$timenow.'.zip');