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. iOS加载Gif图片的N种方式 By-H罗

    1.系统UIImageView 多张图片组成动画 /** * UIImageView 动画 * Memory-23M */ -(void)gifPlay1 { // NSArray *array=@[ ...

  2. pyrealsense2学习

    如何得到realsense设备信息 前提:将D455连接在电脑上,并且已经下载好 Realsense Viewer 打开Realsense Viewer--> Info, 便可得到相机的一些参数 ...

  3. 015 Linux 标准输入输出、重定向、管道和后台启动进程命令

    目录 1 三种标准输入输出 2 什么是重定向?如何重定向? (1)什么是重定向? (2)如何重定向? 3 管道符以及和它容易混淆的一些符号使用 (1)管道符 | (2)&和&& ...

  4. PyCharm编程软件详细安装教程

    PyCharm编程软件安装教程&破解 一.官网下载软件 1. 网页搜索进入PyCharm官网下载页面(https://www.jetbrains.com/pycharm/download/ ) ...

  5. Netty核心原理

    Netty核心原理 1. Netty介绍 1.1 原生NIO存在的问题 NIO的类库和API使用繁杂 需要具备其他额外的技能,如java多线程编程等才能编写出高质量的NIO程序 开发工作量和难度都非常 ...

  6. ajax的发展

    ajax(Asynchronous Javascript and XML)异步javascrip和XMl. ajax只是一种web交互方法.在客户端(浏览器)和服务区段之间传输少量的信息.从而为用户提 ...

  7. Dubbo基础三之配置方式简述

    Dubbo基础一之实战初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中,体验了两种配置方式一种注解一种xml.其中xml是在注解配置失败没有找到解决方法后选择xml替代体验的.那 ...

  8. 自创Web框架之过度Django框架

    目录 自创Web框架之过度Django框架 软件开发架构 HTTP协议 Web框架之"撸起袖子加油干" Web框架之通过wsgiref加油干 封装优化处理 动静网页 jinjia2 ...

  9. 解决页面js、css代码样式失效

    解决方式 根据地址不同的层级深度,加上对应的 " . . / "(不推荐): 去掉所有的 " . . / ", 在js或css的路径前 加上 " / ...

  10. Eclipse插件开发demo

    一.安装 1. 下载安装JDk 2. 下载安装PDE(Plugin-in Development Environment) 访问eclipse官网,点击Download,选择Download Pack ...