zoukankan      html  css  js  c++  java
  • 关于m3u8格式的视频文件ts转mp4下载和key加密问题

    一,利用网站浏览器F12键,利用谷歌浏览器插件找到视频的.m3u8文件,并打开。

    二,打开m3u8文件后,里面有很多.ts的链接,和key的链接。

    三,保存为html文件,下载ts文件,代码如下:可加多线程,可能需要用代理。

     1 # 爬虫 123.html就是打开m3u8文件右键保存为html格式。
     2 htmlf=open('./123.html','r',encoding="utf-8")
     3 htmlcont=htmlf.read()
     4 # print(htmlcont)
     5 import requests
     6 from lxml import etree
     7 tree = etree.HTML(htmlcont)
     8 href = tree.xpath("//a//@href")
     9 # print(href)
    10 ts = href[2273:]
    11 print(len(ts))
    12 # print(ts)
    13 for i in ts:
    14     a = i.split("/")[-1]
    15     # print(a)
    16     headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"}
    17     try:
    18         rest = requests.get(i,headers=headers)
    19         if rest.status_code == 200:
    20             with open(a,"wb") as fp:
    21                 fp.write(rest.content)
    22                 fp.close()
    23     except Exception as e:
    24          print(e)

    四,方法参考1:

    参考链接:https://gist.github.com/larvata/95df619df7109d8b74d2b965a3266354#ffmpeg-cheatsheet

    首先 先下载 key 和 m3u8 
    然后修改 m3u8 中 key 的路径
    最后 用 ffmpeg 下载
    ffmpeg -i <source.m3u8> -c copy <target.ts>

    四,方法参考2:

    关于m3u8文件, ts文件解密, hls 解密. 一些记录

     使用openssl 解密

    openssl aes-128-cbc -d -in 原.ts -out 解密后.ts -nosalt -iv 偏移量 -K key16进制
    其中 iv 偏移量和 key 一般都会在 m3u8 中。 key要按地址下载下来, iv偏移量是可选的,如果m3u8里没有iv,iv可以随便设置为0。
    还可以直接使用 ffmpeg 直接合并文件。

     五,对于加密的m3u8文件:

    m3u8视频另一种下载方式
    如上图中用ts链接直接下载下来的ts视频文件是加密的(为什么要下加密的?虽然加密但是下载速度快啊)。

    #EXT-X-KEY 字段已经写明了加密方式是AES-128,key通过URI获取,IV也有。

    那怎么解密呢?
    1.复制URI地址到网页,你将秒速自动下载得到一个16字节文件
    2.打开终端,打开该文件查看16进制:

    六,获取key值:

     下载m3u8里的key文件,下载winhex.exe应用程序,安装之后,把key文件拖入winhex里,自动生成16进制。

     七,合成下载好的.ts文件:

    左下角点击运行:cmd

    copy /b  文件所在盘:子文件*.ts  储存的文件夹:子文件 ew.ts

    把上边的汉字换成盘符和文件所在的文件夹。

    注意:合并ts文件时,如果ts文件超过1000,排序就会有问题,会出现,121,1210,1211.。。。。。122,1220,1221,1222.。。。。。

    这里分为几个部分,按批次合并。

    八,合成一个ts文件之后还不能打开,因为ts是加密的。

     这里,没有iv值,用0代替。这样解密之后的ts文件即可播放。

    九,注:ts文件的顺序必须是有序的,不可缺少的。

    参考网址:简书:https://www.jianshu.com/p/1b0adcc7b426

     所有的ts转MP4,新建文本文档,ren *.mp4 *.ts,修改后缀.bat,运行即可。

     key值文件下载如下图:(需转16进制数)

     十,关于报错

    hex string is too short, padding with zero bytes to length
    bad decrypt
    25916:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:cryptoevpevp_enc.c:559:

    解决方法:

    # 遍历文件夹进行解密(执行cmd命令,一定查看当前路径问题)
    import os
    for root, dirs, files in os.walk("E://BaiduNetdiskDownload//123//1",topdown=False):
    	print(len(files))
    	os.system("cd 1")
    	os.system("cd")
    	for f in files:
    		print(f)
    		# os.system("openssl aes-128-cbc -d -in 7udG3475000.ts -out ./11/7udG3475000.ts -iv 00000000000000000000000000000000 -K 65323739393530323866636362626661"%(f,f))
    		os.system("openssl aes-128-cbc -d -in ./1/%s -out ./1/11/%s -iv 00000000000000000000000000000000 -K 65323739393530323866636362626661"%(f,f))
    

      先解密,再合并为一个文件。先把一个个小的ts文件解密,之后再进行合并为大的ts,最后再改格式为MP4,这种比较好,视频播放不会出现卡顿,如果是先合并再解密,断点播放会出现卡顿现象。

    文件夹如图:1234文件夹里每个ts都经过解密,然后合并为111222333444四个文件。在进行合并改格式即可。

    报错问题函待解决:

    用 openssl 进行解密,知道是 AES-128-CBC 解密,有 key 文件( 16 字节),用 hexdump 查看密钥发现是 32 字节的,用命令 openssl aes-128-cbc -d -in in_file.ts -out out_file.ts -nosalt -iv 00000000000000000000000000000001 -K XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 进行解密,解密到最后提示 error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:528: 查阅过资料出现 EVP_DecryptFinal_ex 函数错误这提示有可能是还有没解密完的数据块,一般情况是密文不正确、不是块大小的整数倍才会出现没解密完的数据块,但是我尝试下载解密其他码率的 m3u8 文件(如 500K,1000K,2000K )用的都是同个密钥,都能成功解密,唯独这个 3000K 的解密出现问题,之后以为是文件下载不完全,后来又下载下载了一直想不通哪里出问题,是因为视频容量太大导致吗?还是我解密的方法有问题。

  • 相关阅读:
    每天一个linux命令(21):chgrp,chown,chmod
    设计模式之单例模式
    每天一个linux命令(20):find命令之exec
    每天一个linux命令(19):find 命令概览
    每天一个linux命令(18):locate 命令
    每天一个linux命令(17):whereis 命令
    【6折抢】戴尔i7新品Latitude高性能商用本
    Spring Cloud Gateway VS Zuul 比较,怎么选择?
    Zookeeper怎么实现分布式锁?
    数据库怎么分库分表,垂直?水平?
  • 原文地址:https://www.cnblogs.com/String-Lee/p/11391893.html
Copyright © 2011-2022 走看看