PHP 离线下载M3U8等其他格式合成Mp4 依赖FFMPEG
//各位大哥能不能讲点武德?转载就转载了,你留个源网址行不行? //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修改放行相关函数,如
shell_exec
请修改流内存限制,否则默认的是60Mb,导致下载失败,也可以自行修改代码,不使用流的方式发送文件,改成
header('Location: ./movies/'.$timenow.'.zip');