上一篇写了PHP生成合并ts脚本,后来又想直接下载m3u8里面的ts,又码了一段。
<?php
/*
* PHP下载m3u8视频和及解析下载ts资源文件
*
* @file m3u8download.php
*
* @author RoadToTheExpert
* @site https://blog.csdn.net/roadtotheexpert
* @version 简单版
*/
function echon($s) {
echo $s . PHP_EOL;
}
function m3u8download($m3u8_url, $ts_url_dir, $out_dir) {
$m3u8_data = @file_get_contents($m3u8_url);
if(empty($m3u8_data)) {
echon('获取m3u8数据失败:' . $m3u8_url );
return;
}
preg_match_all('/.*\.ts/', $m3u8_data, $matches);
if(empty($matches)) {
echon('获取ts数据失败');
return;
}
if( !file_exists($out_dir) ) {
if( !mkdir( $out_dir ) ) {
echon('创建目录失败:'.$out_dir);
return;
}
}
$ts_url = '';
$ts_save_to = $out_dir . '\big.ts';
foreach ($matches['0'] as $key => $val) {
if( strpos($val, 'http') === 0 ) { //如果ts是http开始
$ts_url = $val;
} else if( $ts_url_dir == 'auto' ) { //等于auto则取m3u8的dirname
$ts_url = dirname($m3u8_url) + '/' + $val;
} else {
//如果ts是basename,且与m3u8不在同一目录,你需要手动赋值$ts_url_dir
$ts_url = $ts_url_dir + '/' + $val;
}
$ts_dat = @file_get_contents($ts_url);
if( !empty($ts_dat) ) {
//合成大ts文件,可能会报内存不足
//file_put_contents($ts_save_to, $ts_dat, FILE_APPEND);
$ts_save_to = $out_dir . '\\' . sprintf('%05d', $key) . '.ts';
file_put_contents($ts_save_to, $ts_dat);
echon( $val . ' [SaveTo] ' . $ts_save_to );
} else {
echon( 'Faile to fetch : ' . $val );
}
}
}
//m3u8的url
$m3u8_url = 'https://vod.xxx.com/2021/1000kb/hls/index.m3u8';
//m3u8里面的ts地址是否需加前缀
$ts_url_dir = 'auto';
//已有目录。
$out_dir1 = 'E:\1';
//将要新建的目录。
$out_dir2 = '\ddr';
m3u8download($m3u8_url, $ts_url_dir, $out_dir1 . $out_dir2 );
|