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. 自定义带图片和文字的Button的排版--陈棚

    自定义button,动态加载图片与文字 [footView addSubview:btnAllChoose]; [btnAllChoose setTitle:str forState:UIContro ...

  2. 【发点感慨】我的cnblogs的文章被爬到了别的网站,阅读量比在cnblogs上还要高

    近期我写了挺多VictoriaMetrics的文章,在搜索相关文章的时候发现,我的文章被别的网站爬去了: 写写技术文章就是无偿分享给别人看的,越多人看到越多人受益,这一点没毛病. 但是: 爬了别人的文 ...

  3. 01 前端基础之HTML

    目录 前端基础之HTML HTML简介 如何创建及展示 head内常见标签 body内基本标签 特殊符号 常见标签 标签的两大重要属性 列表标签 表格标签 form表单(很重要) 初次体验前后端交互 ...

  4. 3、网络并发编程--udp代码、操作系统发展史、多道技术、进程理论

    昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...

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

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

  6. 上架打包错误:error itms-90086

    这是一个很纠结的错误 大家第一反应肯定是 赶紧去看看 位数是否设置  然后发现没有问题  就开始懵逼了 (比如我) 然而无意看到了一个人写的简书 这个人在 Overflow 找到了一个答案 比如你选择 ...

  7. OpenLDAP测试搭建

    目录 ldap介绍 测试环境 安装LDAP服务端 设置LDAP的root密码 配置LDAP服务端 创建LDAP证书 设置LDAP数据库 创建LDAP用户 添加防火墙规则 开启LDAP日志 配置LDAP ...

  8. Centos 6 DNS 配置 解决 Unknown host

    测试服务器Maven 打包时遇到了如下的错误 maven.aliyun.com: Name or service not known: Unknown host maven.aliyun.com: N ...

  9. KALI搭建Docker+Vulhub漏洞复现环境

    在学习网络安全的过程中,少不了的就是做漏洞复现,而漏洞复现一般比较常用的方式就是使用docker-vulhub进行环境搭建,我近期也遇到了这个问题,但是网上的教程特别混乱,根本起不到帮助作用,即使有可 ...

  10. 2022必须拥有Chrome扩展程序 - 浏览器插件,让你上网效率翻倍

    在Chrome网上应用店中查找扩展程序 2022必须拥有Chrome扩展程序 - 浏览器插件,让你上网效率翻倍 可扩展的Chrome Web浏览器比某些人认识的功能强大得多.您可以自定义浏览体验,使其 ...