m3u8文件合并处理

简介

M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。"M3U" 和 "M3U8" 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。

HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。

HLS 只请求基本的 HTTP 报文,与实时传输协议(RTP)不同,HLS 可以穿过任何允许 HTTP 数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。

简单来说,m3u8是一个视频格式,就是将一个视频分成很多的小部分,这样方便视频的加载。

格式解析

完整的m3u8文件有三部分:

  • index.m3u8,保存视频的基本信息和分段文件顺序;
  • key,如果视频加密,保存密钥;
  • data文件,其他都是视频的数据文件。

这是一个index.m3u8的内容,

  • #EXTM3U,是文件开始

  • #EXT-X-VERSION,标识HLS的协议版本号;

  • #EXT-X-TARGETDURATION,表示每个视频分段最大的时长(单位秒);

  • #EXT-X-MEDIA-SEQUENCE,表示播放列表第一个 URL 片段文件的序列号;

  • #EXT-X-PLAYLIST-TYPE,表明流媒体类型;

  • #EXT-X-KEY,加密方式,这里加密方式为AES-128,同时指定IV,在解密时需要;

  • #EXTINF,示其后 URL 指定的媒体片段时长(单位为秒);

  • 第8行指定媒体片段,媒体片段之前必须指定EXTINF标签。

视频融合

这里使用python3编写,这里所有的文件都进行了加密,

import os
import sys
import time
from Crypto.Cipher import AES def fileList(findex):
rpath = os.path.dirname(os.path.realpath(findex))
name = rpath.split("\\")[-1]
fi = open(findex, 'r')
flag = False
IV = None
tl = []
for line in fi.readlines():
if line.startswith("#EXT-X-KEY"):
# 如果存在 IV 则提取;
if line.split(",")[-1].startswith("IV="):
IV = line.split(",")[-1][5:]
IV = bytes.fromhex(IV)
if line.startswith("#EXTINF"):
flag = not flag
continue
if flag:
tmp = line.strip().split("/")[-1]
tmp = os.path.join(rpath, tmp)
tl.append(tmp)
flag = not flag
fi.close()
fk = open(os.path.join(rpath, "key"), 'rb')
key = fk.read()
fk.close()
return name, tl, key, IV def aes_decode(data, key, IV):
# 如果没有指定 IV 值,则直接使用 key 值
if not IV:
IV = key
cryptor = AES.new(key, AES.MODE_CBC, IV)
plain_text = cryptor.decrypt(data)
return plain_text def main():
fp = os.listdir()
used = [s[:-4] for s in os.listdir("./result/")]
for ind in fp:
if not ind.isdigit():
continue
if ind in used:
continue
try:
name, fl, key, IV = fileList(os.path.join(ind, "index.m3u8"))
except:
print("-"*30)
print("[-] Errot! file: ", ind)
print("-"*30)
continue
print("[*] Begin process file: ", name)
start = time.time()
f = open(os.path.join("./result/", name+".mp4"), 'ab')
for i in fl:
with open(i, 'rb') as inf:
data = inf.read()
f.write(aes_decode(data, key, IV))
f.close()
print("[+] Sucessfully! Cost time: ", time.time()-start) main()

使用程序的格式为:

./
|-- m3u8.py
|-- result
|-- 文件1
|-- key
|-- index.m3u8
|-- data...
|-- 文件2
|-- ...

其他

m3u8文件合并处理的更多相关文章

  1. 加密的m3u8、ts文件合并

    加密后的ts文件不能直接合并或播放,需要使用key对每个ts文件进行解密. 分为两种情况: (1).如果ts文件已经全部下载好,则可以直接在本地通过ffmpeg快速解密合并. (2).如果ts文件没有 ...

  2. .ts 视频文件 .m3u8视频文件合并 转换为mp4

    1. 先把 .m3u8.zip 格式文件解压到文件夹D:\a. 2. 将文件夹内的 .ts文件名处理好. 一般均为按顺序排列. (殊情况需要根据.m3u8文件记录处理.) 举例,根据实际情况处理. ( ...

  3. 网络视频m3u8解密及ts文件合并

    网络视频m3u8解密及ts文件合并 参考了两篇博客: https://blog.csdn.net/weixin_41624645/article/details/95939510 https://bl ...

  4. m3u8文件什么合成便于播放的MP4的方法

    先大家要知道M3U8文件不是一个视频文件,里面全是一些路径,说白了就是一个目录而已,所以要看视频,要找到对应存放视频的文件夹.如果不知道怎么找,可以使用文本格式打开M3U8文件,里面会有路径提示.   ...

  5. CDN的combo技术能把多个资源文件合并引用,减少请求次数

    CDN的combo技术能把多个资源文件合并引用,减少请求次数.比如淘宝的写法: <link rel="stylesheet" href="//g.alicdn.co ...

  6. linux 两个文件合并

    可以使用cat命令,有两种实现的方式,一种将两个文件合并的到一个新的文件,另一种将一个文件追加到另一个文件的末尾. 方法一:使用cat命令从文件中读入两个文件,然后将重定向到一个新的文件.这种方法可以 ...

  7. grunt配置太复杂?使用Qbuild进行文件合并、压缩、格式化等处理

    上次简单介绍了下Qbuild的特点和配置,其实实现一个自动化工具并不复杂,往简单里说,无非就是筛选文件和处理文件.但Qbuild的源码也并不少,还是做了不少工作的. 1. 引入了插件机制.在Qbuil ...

  8. js或css文件合并的三种方式推荐

    源文档 <http://www.jb51.net/article/32834.htm> 在Web项目的开发中,js,css文件会随着项目的开发变得越来越多,越来越大,这就给给性能方面带来一 ...

  9. AngularJS结合RequireJS做文件合并压缩的那些坑

    我在项目使用了AngularJS框架,用RequireJS做异步模块加载(AMD),在做文件合并压缩时,遇到了一些坑,有些只是解决了,但不明白原因. 那些坑 1. build.js里面的paths必须 ...

随机推荐

  1. 懒加载--初步理解. by:王朋

    懒加载(LazyLoad),又称为延迟加载. 举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要滑动 ...

  2. 学习Spring5必知必会(1)~未使用spring前的麻烦

    一.未使用spring前的麻烦 开闭原则:扩展是开放的,但是对于修改是"封闭的". 1.代码耦合度比较高[不符合开闭原则]: public class EmployeeServic ...

  3. C++ 反汇编:关于函数调用约定

    函数是任何一门高级语言中必须要存在的,使用函数式编程可以让程序可读性更高,充分发挥了模块化设计思想的精髓,今天我将带大家一起来探索函数的实现机理,探索编译器到底是如何对函数这个关键字进行实现的,并使用 ...

  4. 基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U VPX接口卡

    一.板卡概述 标准VPX 3U板卡, 基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8.64b ...

  5. zabbix密码复杂度有效期安全增强,符合三级等保要求。

    一.关于三级等保要求 1.zabbix默认没有设置密码复杂度功能,密码有效期功能. 2.zabbix具备失败处理功能,但是没有页面手动调试,需要修改源代码. 3.zabbix具备超时退出功能. 二.整 ...

  6. Java高频面试题70道

    1.作用域public,private,protected,以及不写时的区别? 答:区别如下: 作用域  当前类 同一packag 子孙类 其他package public √ √ √ √ prote ...

  7. vulhub漏洞环境

    0x00 vulhub介绍 Vulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更 ...

  8. [旧][Android] 消息处理机制

    备注 原发表于2016.06.06,资料已过时,仅作备份,谨慎参考 概述 Android 的消息处理机制主要是指 Handler 的运行机制以及 Handler 所附带的 MessageQueue 和 ...

  9. Centos7使用kubeadm安装1.23.1版本的k8s集群

    系统环境 #cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) #Linux内核一定要大约等于3.10,也就是centos版本要大 ...

  10. windows 常用的shell(cmd.exe)命令大全

    Windows常用shell命令大全(转) [Windows常用shell命令大全] 基于鼠标操作的后果就是OS界面外观发生改变, 就得多花学习成本.更主要的是基于界面引导Path与命令行直达速度是难 ...