├── README.md ├── download_m3u8.php └── video └── .gitignore /README.md: -------------------------------------------------------------------------------- 1 | # download-m3u8-to-mp4 2 | This is a simple download m3u8 tool 3 | 4 | 5 | usage 6 | ```php 7 | php /path/to/download_m3u8.php --url "{url}" 8 | ``` 9 | ## Required 10 | - php 11 | - please enable exec function 12 | - ffmpeg 13 | 14 | 15 | 16 | ## Connect me 17 | * email imlewc@126.com -------------------------------------------------------------------------------- /download_m3u8.php: -------------------------------------------------------------------------------- 1 | $value) { 32 | if (strpos($value, 'http') === false) { 33 | $parse_url_result = parse_url($url); 34 | $url_path = $parse_url_result['path']; 35 | $arr = explode('/', $url_path); 36 | array_splice($arr, -1); 37 | $url_path_pre = $parse_url_result['scheme'] . "://" . $parse_url_result['host'] . implode('/', $arr) . "/"; 38 | $value = $url_path_pre . $value; 39 | } 40 | $ts_output = "{$dir}/{$key}.ts"; 41 | $cmd = "curl -L -o {$ts_output} '{$value}'"; 42 | exec($cmd); 43 | echo "\n$cmd\n"; 44 | if (is_file($ts_output)) { 45 | $ts_outputs[] = $ts_output; 46 | } else { 47 | echo "create ts_output file failed ;\n $cmd"; 48 | exit(); 49 | } 50 | } 51 | if ($count > 100) { 52 | $to_concat = array_chunk($ts_outputs, 100); 53 | } else { 54 | $to_concat[] = $ts_outputs; 55 | } 56 | echo "concat ts to mp4\n"; 57 | print_r($to_concat); 58 | foreach ($to_concat as $key => $value) { 59 | $str_concat = implode('|', $value); 60 | $mp4_output = "{$dir}/output{$key}.mp4"; 61 | $cmd = "ffmpeg -i \"concat:{$str_concat}\" -acodec copy -vcodec copy -absf aac_adtstoasc {$mp4_output}"; 62 | exec($cmd); 63 | echo "\n$cmd\n"; 64 | if (is_file($mp4_output)) { 65 | $mp4_outputs[] = $mp4_output; 66 | } else { 67 | echo "create mp4_outputs file failed ;\n $cmd"; 68 | exit(); 69 | } 70 | } 71 | $last = "{$dir}/output.mp4"; 72 | if (count($to_concat) > 1) { 73 | foreach ($mp4_outputs as $key => $value) { 74 | $fileliststr .= "file '{$value}'\n"; 75 | } 76 | $filelist_file = "filelist.txt"; 77 | file_put_contents($filelist_file, $fileliststr); 78 | 79 | $cmd = "ffmpeg -f concat -i {$filelist_file} -c copy {$last}"; 80 | exec($cmd); 81 | echo "\n$cmd\n"; 82 | } else { 83 | $mp4_output = "{$dir}/output{$key}.mp4"; 84 | rename($mp4_output, $last); 85 | } 86 | 87 | if (is_file($last)) { 88 | $cmd = "rm -rf {$dir}/*ts"; 89 | exec($cmd); 90 | echo "\n$cmd\n"; 91 | 92 | echo "\n\nsuccess {$last}\n"; 93 | } else { 94 | echo "\n\nfailed\n"; 95 | } 96 | 97 | 98 | } 99 | } 100 | 101 | 102 | function makedir($dir) 103 | { 104 | return is_dir($dir) or (makedir(dirname($dir)) and mkdir($dir, 0777)); 105 | } 106 | -------------------------------------------------------------------------------- /video/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | --------------------------------------------------------------------------------