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. Sping高质量博文链接集合

    1. Spring事务传播行为详解 https://segmentfault.com/a/1190000013341344

  2. shell——eval exec

    eval # cat test.sh echo \$$# eval "echo \$$#" # sh test.sh a b c $3 c shell的内建命令exec将并不启动新 ...

  3. 【web安全】Nodejs原型链污染分析

    Nodejs原型链污染分析 什么是js原型? 可以将js原型理解为其他OOP语言中的类,但还是有细微区别. 1. function F(){...} 2. var f = new F(); 分析: 1 ...

  4. Docker Explore the application

    https://docs.docker.com/docker-for-mac/#explore-the-application   Open a command-line terminal and t ...

  5. 我们一起来学Shell - 初识shell

    文章目录 Shell 的分类 `bash` `csh` `ksh` `tcsh` `sh` `nologin` `zsh` Shell 能做什么 bash 环境变量文件 `/etc/profile` ...

  6. can_has_stdio?

    得到一个用±<>这样符号组成的五角星,结合题目stdio,估计是c语言编译后的文件 查到BrianFuck语言,找个在线编译器或者找到编译码(c++)得到flag 在线编译网站 brain ...

  7. [题解]UVA11029 Leading and Trailing

    链接:http://vjudge.net/problem/viewProblem.action?id=19597 描述:求n^k的前三位数字和后三位数字 思路:题目要解决两个问题.后三位数字可以一边求 ...

  8. 网络测试技术——802.1X TLS认证(上篇)

    一.TLS认证简介 1.TLS认证 (1)认证过程 · 最安全认证技术 · 实施最复杂 (2)TLS双向证书认证 · 服务器对客户端进行认证 · 客户端对服务器进行认证 2.TLS认证过程 3.交换机 ...

  9. Winform实现客户端的自动更新

              话不多说,直接上干货.当然也希望各位前辈多多指导. 自动更新客户端的设计原理图 请花两分钟时间,仔细阅读下面这张图,明白客户端自动升级的原理.        自动更新的效果图 1. ...

  10. Java课程设计---安装解压版mysyql

    1.解压 将mysql-5.7.13-winx64.rar解压到C盘根目录.(将原有data文件夹清空,注意是清空,不是删除data文件夹) 2. 配置环境变量MYSQL_HOME (参照java打开 ...