找回密码
 会员注册
查看: 27|回复: 0

Python神器:一键下载M3U8并转换为MP4

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71625
发表于 2024-9-9 13:18:35 | 显示全部楼层 |阅读模式
在这个数字时代,我们经常在网页上遇到各种精彩的视频,但往往只能观看而无法下载。今天,我将向大家介绍如何使用Python自动下载网页中的M3U8链接,并将其转换为MP4格式,让你轻松保存喜欢的视频!一、准备工作首先,确保你已经安装了ffmpeg。如果还没有安装,可以通过以参考这里安装:https://wizops.net/archives/202404/323.html二、代码流程下载M3U8文件保存到临时目录。下载key文件保存到临时目录。生成本地M3U8文件内容保存到临时目录。下载ts文件保存到临时目录下的index目录。 使用ffmpeg将m3u8转换成mp4文件三、代码实现importosimporturllib3importrequestsimportsubprocessfromm3u8importM3U8fromtenacityimportretry,wait_random,stop_after_attemptfromgevent.poolimportPoolurllib3.disable_warnings()pool=Pool(10)@retry(stop=stop_after_attempt(3),wait=wait_random(2,5))defrequest(url):"""发送请求"""try:res=requests.get(url,verify=False,timeout=5)returnresexceptExceptionase:print(url,e)raiseedefdownload_segment(url,path):"""下载ts文件"""filename=url.split("/")[-1]file=os.path.join(path,filename)ifos.path.exists(file):returnres=request(url)withopen(file,"wb")asf:f.write(res.content)defconvert_mp4(path,output):#使用FFmpeg将local.m3u8转换为一个MP4文件ffmpeg-allowed_extensionsALL-iindex.m3u8-ccopyxxx.mp4#m3u8文件中有key需要带参数-allowed_extensionsALLsubprocess.call(['ffmpeg','-allowed_extensions','ALL','-i','local.m3u8','-c','copy',output],cwd=path)defdownload_m3u8(url,path,output):"""下载单个m3u8主程序url:m3u8链接urlpath:单个m3u8目录output:转换输出文件路径名"""base_url=url.rsplit("/",1)[0]#创建目录segment_dir=os.path.join(path,"index")ifnotos.path.exists(segment_dir)s.makedirs(segment_dir)#下载M3U8文件m3u8_file_name=os.path.join(path,"index.m3u8")res=request(url)withopen(m3u8_file_name,"w",encoding="utf-8")asf:f.write(res.text)#解析M3U8文件m3u8_obj=M3U8(res.text)print(m3u8_obj.keys)#下载key文件foriteminm3u8_obj.keys:ifitem:key_url=item.uriifitem.uri.startwith("http")elsef"{base_url}/{item.uri}"key_file_name=os.path.join(path,item.uri)res=request(key_url)withopen(key_file_name,"w",encoding="utf-8")asf:f.write(res.text)segments=[]#生成新的本地M3U8文件内容forsegmentinm3u8_obj.segments:segments.append(segment.uri)segment.uri="index/"+segment.uri.split("/")[-1]#保存M3U8文件local_file_name=os.path.join(path,"local.m3u8")withopen(local_file_name,'w')asf:f.write(m3u8_obj.dumps())#下载ts文件forurlinsegments:pool.spawn(download_segment,url,segment_dir)pool.join()#ts文件下载完成,转换成mp4文件iflen(segments)==len(os.listdir(segment_dir)):convert_mp4(path,output)if__name__=="__main__":url="https://v3.mstopq.com/202302/26/E92zcVVNkT1/video/1000k_0X720_64k_25/hls/index.m3u8"cur_path=os.path.abspath(os.path.dirname(__file__))path=os.path.join(cur_path,"终结者创世纪_tmp")output=os.path.join(cur_path,"终结者创世纪.mp4")download_m3u8(url,path,output)三、注意事项确保已经安装了ffmpeg,并且在系统路径中可以访问到。输出路径必须存在,否则可能会出现错误。根据实际情况,可能需要根据M3U8文件的具体内容调整ffmpeg命令的参数。通过这个简单的示例,你可以使用Python自动下载网页中的M3U8链接并将其转换为MP4格式。现在,你可以轻松保存喜欢的视频,随时随地观看啦!希望这个技巧对你有所帮助。如果有任何问题或建议,欢迎在评论中留言!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 06:16 , Processed in 0.497036 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表