因为在线看视频时有的会比较卡顿,刚好也有闲置测试用的树莓派搭建的小服务器,本着不浪费的精神,就想着是不是能把视频下到本地,这样就不用担心卡顿了,刚好前面也记录过ffmpeg下载合并视频,以及aria2下载的,于是就有了一个不知道是不是高效安全的方式,记录下。

首先试过使用ffmpeg来直接通过外网的m3u8进行同时下载与合并生成mp4,但是发现速度很慢,只有1~3百K左右,盲猜是在一个个下ts文件,而且不知道什么原因,当到一定程度的时候,会有一定几率出现ffmpeg卡住的问题。

然后试过使用php的file_get_contents和file_put_contents来下载保存,但是一样速度超级慢,只怪Sham不会并发。

然后试了通过aria2下载,发现速度不错,家里300m宽带能到3~7MB/s浮动多。

于是就有了思路:

首先通过php来获取m3u8文件里的ts地址列表,然后生成本地用的m3u8文件,以及部分有加密用的.key文件。

然后就通过aria2c来批量下载ts地址文件中的地址。

最后就是通过ffmpeg来通过本地m3u8,获取本地的ts文件并合并生成mp4,速度明显提升

下面是Sham写的,记录备忘下

执行方法是通过网页访问这个php页,加上参数?name=xxx&m3u8=http://xxx.com/m3u8

<?php
if(isset($_GET['m3u8'])){//获取url$url = $_GET['m3u8'];//获取网址域名$urlarr = explode('/',$url);$domain = $urlarr[0].'//'.$urlarr[2].'/';//先判断传入的m3u8里面有没有直接包含ts地址,还是套着一个m3u8文件$url = Check_m3u8($url);//定义m3u8名字,用于区分不同的m3u8,用自定义则获取,没有则通过网址里的信息来$m3u8_name = $_GET['name']!=null && $_GET['name']!='' ? $_GET['name'] : $urlarr[3]."_".$urlarr[4];//判断、新建tslist文件夹,用于存储if(!file_exists('tslist/')){mkdir('tslist/',0777); }//通过名称建立不同文件夹$dir = 'tslist/'.$m3u8_name.'/';$ts_dir = $dir.'ts/';if(!file_exists($dir)){mkdir($dir,0777); }if(!file_exists($ts_dir)){mkdir($ts_dir,0777); }//获取m3u8文件里面的信息,并生成数组$content = explode(chr(10),file_get_contents($url));$i = 1;//这个是用来单独存储ts文件真实网址的$ts_url ='';//这个是用来新建本地m3u8文件,保证路径与下载保存的ts文件路径一致$m3u8_content = '';//通过循环来获取m3u8文件里每一行的信息foreach ($content as $v){//获取Key,并保存到本地if(strstr($v,'.key')){$get_key = explode('"',$v);$key_url = $get_key[1];//如不带域名,则添加,带了就保留$key_urls = strstr($key_url,'http') ? $key_url : $domain.$key_url;file_put_contents($dir.$m3u8_name.'_key.key',file_get_contents($key_urls));//用于本地m3u8文件,key路径与m3u8文件在同一个文件夹$m3u8_content .= $get_key[0].'"'.$m3u8_name.'_key.key"'.chr(10);}//获取正式ts文件网址elseif(strstr($v,'.ts')){//如不带域名,则添加,带了就保留$ts_urls = strstr($v,'http') ? $v : $domain.$v;$ts_url .= $ts_urls.chr(10);//获取ts文件名$ts_name = explode('/',$v);$m3u8_content .= 'ts/'.end($ts_name).chr(10);}else{$m3u8_content .= $v.chr(10);}}file_put_contents($dir.$m3u8_name.'.m3u8',$m3u8_content);file_put_contents($dir.$m3u8_name.'_ts_list.txt',$ts_url);//通过执行aria2里下载$res = shell_exec('aria2c --dir='.dirname(__FILE__).'/'.$ts_dir.' -i '.$dir.$m3u8_name.'_ts_list.txt');if($res){shell_exec('ffmpeg -allowed_extensions ALL -i '.dirname(__FILE__).'/'.$dir.$m3u8_name.'.m3u8 -c copy '.dirname(__FILE__).'/'.$dir.$m3u8_name.'.mp4');}
}else{echo "请传入m3u8地址,以?m3u8=http://xxxx.com/xxx.m3u8的方式";
}//判断m3u8里面有没有再包含m3u8文件function Check_m3u8($url){global $domain;$m3u8_content = file_get_contents($url);if(strstr($m3u8_content,'.m3u8')){$m3u8_contents = explode(chr(10),$m3u8_content);foreach($m3u8_contents as $m3u8){if(strstr($m3u8,'.m3u8')){$url = strstr($m3u8,'http') ? $m3u8 : $domain.$m3u8;break;}}Check_m3u8($url);}return $url;}

这个方法的缺点就是需要将PHP的最大脚本运行时间调大,不然会报502错误,还有就是需要开放shell_exec函数,不知道对安全性会不会有影响。
当然有个好处就是感觉挺快,对只会点php的人来说是个不错的方法

php+aira2+ffmpeg下载m3u8文件并保存成mp4相关推荐

  1. 将M3U8文件视频转成mp4并保存到本地 - PUSDN

    本文由PUSDN - 平行宇宙统一软件开发者网www.pusdn.com强力驱动 1. 下载VLC软件 和M3U8格式打交道,少不了一个软件就是VLC. 进入官网下载https://www.video ...

  2. ffmpeg下载m3u8工具大全

    M3U8 是Unicode版本的 M3U,用UTF-8编码."M3U" 和 "M3U8" 文件都是苹果公司使用的HTTP Live Streaming(HLS) ...

  3. 「Python|音视频处理|场景案例」如何使用ffmpeg下载m3u8视频到本地并保存成mp4

    本文主要介绍如何使用ffmpeg批量下载视频到本地并保存成指定格式. 文章目录 场景说明 解决方案 源代码 场景说明 当我们希望将网页上的视频下载到本地的时候,我们可能获取到的视频地址是指向.m3u8 ...

  4. 使用ffmpeg将m3u8文件转为mp4

    window环境使用ffmpeg将m3u8文件转为mp4 issue: 不存在 ffmpeg 去ffmpeg官网下载一个, 然后指派系统变量path, 我下的是https://github.com/B ...

  5. 使用 ffmpeg 下载 m3u8 视频,linux 后台运行 ffmpeg

    使用 ffmpeg 下载 m3u8 视频,linux 后台运行 ffmpeg 下载 m3u8 现在的视频大多数都是 m3u8 格式,网上的介绍也不少,那我直接记录一下下载的方法 方法 1 M3U8-D ...

  6. 脚本工具之下载M3U8文件类型的完整视频二-优酷

    上一篇文章<脚本工具之下载M3U8文件类型的完整视频>分享了鹅厂视频获取方法,今天分享一个优酷视频下载方法. 依赖说明 运行环境: Python3环境 内置播放命令: ffplay (需要 ...

  7. 将word转换html格式的文件,word 保存成 html格式文件

    怎样将word文件保存为HTML格式 将word文件保存为HTML格式的方法:1.打开需要保存为html的word文档2.点击左上角的另存为:3.在弹出的保存窗口中,选择保存类型为html,确定:4. ...

  8. FLV格式文件如何转换成MP4格式 1

    FLV流媒体格式是随着Flash MX的推出发展而来的视频格式,它形成的文件小,加载速度快,流量耗的少,使得网络看视频成为可能,因此FLV是被众多新一代视频分享网站所采用,是目前增长最快,最广泛的视频 ...

  9. mkv文件怎么转换成mp4?来看看这四种转换方式吧!

    mkv文件怎么转换成mp4?在很多小伙伴看到,图片就是图片,音频就是音频,视频就是视频,它们展现给人们的效果都差不多.但实际上,不管是图片.视频还是音频文件,其中一个重要的区别在于它们的文件格式可能是 ...

  10. mkv视频文件怎么转成mp4,这3个方法很好用

    对于那些电脑不是很精通的小伙伴来说, mkv视频文件怎么转成mp4?小编先来介绍一下mkv视频格式,mkv是一种开放标准的自由的容器和文件格式,是一种多媒体封装格式,能够在一个文件中容纳无限数量的视频 ...

最新文章

  1. php语句中两个if语句,如何在PHP中组合两个IF语句
  2. JAVA设计模式之命令模式
  3. orm 通用方法——RunProc调用存储过程
  4. Lucene知识小总结4:索引的反删除
  5. icem密度盒怎么设置_怎么做好火灾自动报警系统施工安装?
  6. spring加载xml配置文件
  7. 【论文阅读】JDA(joint distribution adaptation)/2013初稿
  8. Socket.io 的 emit
  9. Excel函数实战技巧精粹(四)常用函数之COUNTIF和SUMIF详解
  10. 如何用c语言读文件,如何用C语言读写文件
  11. 客所思S10外置USB独立声卡调试教程:K歌、聊天、变声、喊麦、电音等效果
  12. vision-transformer(b站霹雳吧啦博主)
  13. m3u8视频下载和转码mp4
  14. keepalived IP漂移技术
  15. RewriteBase: only valid in per-directory config files 解答:
  16. 戴尔服务器显示器接口类型,戴尔推出UltraSharp U4021QW显示器 采用雷电3接口和5K×2K曲面屏...
  17. eclipse新建JSP页面报错:Multiple annotations found at this line解决方法
  18. python 爬取豆瓣的美剧
  19. 反爬虫原理与绕过实战
  20. 关于猜数字中随机数的产生

热门文章

  1. 为什么ios比android流畅
  2. 10秒钟搞定圆柱齿轮设计所有课题
  3. 10年外贸人工具:邮件群发软件工具哪个好?
  4. python计算图像灰度共生矩阵_灰度共生矩阵-python
  5. 让婚纱照带上异域风情!
  6. 数据分析案例 |【01】电影数据分析
  7. 关于mysql插入数据报错:Incorrect string value: '\xE9\x81\x93\xE5\x85\xB7...' for column 'gclass' at...
  8. 如何利用云流送(Cloud Streaming)构造一个全三维、沉浸式的数字化虚拟景区
  9. 荷马史诗——解题报告
  10. 人流量统计管理平台汇总显示方案_实现在场人数管控