您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
m3u8下载器php版(新增优化了支持ts在非根目录)
发布时间:2026-07-06 23:04:22编辑:雪饮阅读()
-
m3u8下载器php版(新增优化了支持ts在非根目录)
<?php
/*
*命令参考
* -m:m3u8地址
* -o:输出路径
* D:\phpstudy_pro\Extensions\php\php7.4.3nts\php.exe -c D:\phpstudy_pro\Extensions\php\php7.4.3nts\php.ini C:\Users\Administrator\PhpstormProjects\untitled\m3u8_download.php -m https://hot.qoqkkhy.com/20230720/V4Docige/1000kb/hls/index.m3u8 -o C:\Users\Administrator\PhpstormProjects\untitled\ChangAn.mp4
*
*
* 参考
* ffmpeg -threads 0 -i "https://hot.qoqkkhy.com/20230720/V4Docige/1000kb/hls/index.m3u8" -c copy -y "C:\Users\Administrator\PhpstormProjects\untitled\ChangAn.mp4"
* */
$ffmpegPath='D:\software\ffmpeg-master-latest-win64-gpl\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe';
print_r($argv);
$m=null;
$o=null;
if($argv[1]=="-m"){
$m=$argv[2];
}
if($argv[3]=="-o"){
$o=$argv[4];
}
if(!$m){
exit();
}
if(!$o){
exit();
}
//取得m3u8资源根链接
$result22=parse_url($m);
$m3u8_root=$result22["scheme"]."://".$result22["host"];
$path = $result22['path'];
$m3u8_path = dirname($path) . '/';
//创建当前任务目录
print_r("开始创建当前任务目录\r\n");
$dir="m3u8_download/".md5($m);
if(!is_dir($dir)){
$flag21=mkdir($dir,0777,true);
if($flag21){
print_r("当前任务目录创建成功\r\n");
}
}
else{
print_r("当前任务目录已存在,无需创建\r\n");
}
//下载m3u8文件
print_r("开始下载m3u8原始文件\r\n");
$m3u8_original_file=$dir."/original.m3u8";
if (file_exists($m3u8_original_file)){
print_r("m3u8原始文件已存在,无须下载\r\n");
}
try{
$m3u8_content=file_get_contents($m);
file_put_contents($m3u8_original_file,$m3u8_content);
}
catch(\Exception $e){
print_r("下载m3u8原始文件失败(96)\r\n");
exit();
}
//提取ts链接集合
print_r("开始提取ts链接集合\r\n");
$ts_list=[];
$m3u8_original_file_handle = fopen($m3u8_original_file,"r");
$tsSpecifyDir="";
while(!feof($m3u8_original_file_handle))
{
$pattern="/.ts$/";
$line=fgets($m3u8_original_file_handle);
//可能包含有换行符,这里需要做换行处理
$line=trim($line);
//ts链接包含目录
if(strpos($line,"/")!==false){
}
//ts链接不包含目录
if(strpos($line,"/")===false){
$line=$m3u8_path.$line;
}
if(preg_match($pattern,$line)){
array_push($ts_list,$line);
}
}
fclose($m3u8_original_file_handle);
print_r("提取到的ts链接集合\r\n");
print_r($ts_list);
//开始创建当前任务ts目录
print_r("开始创建当前任务ts目录\r\n");
$dir_ts=$dir."/ts";
if(!is_dir($dir_ts)){
$flag21=mkdir($dir_ts,0777,true);
if($flag21){
print_r("当前任务ts目录创建成功\r\n");
}
}
else{
print_r("当前任务ts目录已存在,无需创建\r\n");
}
//开始下载ts文件
$ts_complete_count=0;
foreach($ts_list as $val){
$md576=md5($val);
$file77=$dir_ts."/".$md576.".ts";
$c_ts=$m3u8_root.$val;
//需要判断m3u8中ts文件是否使用的绝对路径
$result103=parse_url($val);
if(isset($result103["scheme"])){
$c_ts=$val;
}
print_r("正在下载ts:".$c_ts."\r\n");
//进度
$rate_of_progress=$ts_complete_count/count($ts_list)*100;
print_r("-------------ts下载进度:".$rate_of_progress."%-------------------\r\n");
if (file_exists($file77)){
$ts_complete_count++;
print_r($c_ts."文件已下载,无须下载\r\n");
}
else{
//如果file_get_contents失败,可以通过curl去排查详细错误
$c_ts_content=file_get_contents($c_ts);
if(!$c_ts_content){
print_r("下载ts:".$c_ts."失败(95)\r\n");
exit();
}
$flag85=file_put_contents($file77,$c_ts_content);
if(!$flag85){
$ts_complete_count++;
print_r("下载ts:".$c_ts."失败(101)\r\n");
exit();
}
$ts_complete_count++;
print_r("下载ts:".$c_ts."成功\r\n");
}
}
if($ts_complete_count!=count($ts_list)){
print_r("当前任务ts下载不完整,可重新尝试\r\n");
exit();
}
print_r("当前任务所有ts下载完成\r\n");
//开始替换生成新的本地m3u8文件
print_r("开始替换生成新的本地m3u8文件\r\n");
$m3u8_new_file=$dir."/new.m3u8";
if (file_exists($m3u8_new_file)){
print_r("m3u8本地文件已存在,无须生成\r\n");
}
else{
$m3u8_content_new=$m3u8_content;
foreach($ts_list as $val){
$md576=md5($val);
$file77="ts/".$md576.".ts";
$m3u8_content_new=str_replace($val,$file77,$m3u8_content_new);
}
file_put_contents($m3u8_new_file,$m3u8_content_new);
print_r("m3u8本地文件生成成功\r\n");
}
$command=$ffmpegPath.' -threads 0 -i "'.realpath($m3u8_new_file).'" -c copy -y "'.$o.'"';
print_r("本地合并ts:".$command."\r\n");
$output = exec($command);
echo $output;
关键字词:m3u8,php,下载器,ts
相关文章
- javascript仿php的$_GET设置修改get地址栏参数(返回新
- 编写一个lib库修复的php脚本(用于glibc升级失败后对ff
- 在php中如何实现rtsp流转换成mp4文件并且异步多进程且
- ffmpeg转推rtsp为rtmp到nginx流媒体(多个推流拉流地址
- 使用ffmpeg将海康开放平台rtsp回放流转rtmp流及转存为
- 6.事件events(及value绑定、change监听处理)
- 08-JDBC-API详解-PreparedStatement-原理(useServerPr
- 05-JDBC-API详解-ResultSet(结果集通过ResultSet遍历
- 调试请求数据并创建project(为基于sail的laravel项目
- p18 He gets paid on a daily basis