python - 对于包含多个 MP4 文件的文件来说,好的分隔符是什么样的?
问题描述
我目前正在尝试通过简单地合并来自多个视频文件(确切地说是.mp4、AVC、AAC)的二进制数据并用我的 Python 脚本可以查找的分隔符分隔这些数据来制作我自己的文件格式。要在合并文件后拆分文件,我目前正在使用这种方法,但我认为它存在以下问题:
PADDING = bytearray(1024)
def split_file(filepath, index):
internal_index = 0
with open(filepath, "rb") as stream:
buffer = bytes()
while True:
chunk = stream.read(10_000_000)
if not chunk:
if internal_index == index:
yield buffer
break
buffer += chunk
while True:
try:
part, buffer = buffer.split(PADDING, 1)
except ValueError:
break
else:
if internal_index == index:
yield part
internal_index += 1
分隔符可能会在块的末尾部分遇到,并且不会被 .split 方法检测到,从而允许将部分分隔符数据写入倾入解压缩视频文件的数据中。我试图检查块的末尾是否包含任何 \x00 字节,但如果文件的数据本身包含这个 \x00 并且它已经结束在块的末尾,那就意味着解析器会错误地认为这是分隔符块的一部分,并会摆脱它。
我还考虑过这样做,以便单独的文件从文件请求的偏移量的倍数开始,但考虑到视频文件可能的大小变化,这种方法不起作用,因为我要么必须为 GB 填充极小的文件或错误地将较大的文件拆分为小文件。
所以我试图寻找一种方法在这些二进制流之间实现一个分隔块,以便它与文件数据区分开来,并且如果它没有被完整读取,也不容易失败。这样做的好方法是什么?谢谢。
解决方案
这项工作面临着信息编码和通信方式的基本限制,这些限制在信息理论和通信理论领域进行了正式研究。
直观地说,假设我们有两块要表示的信息,一个接一个。
一种可能性是将其编码为 <chunk 1> <-separator-> <chunk 2>。这仅在 <chunk 1> 和 <chunk 2> 不包含 <-separator-> 时有效。如果块是任意二进制文件,假设它们不包含匹配 <-separator-> 的序列是不安全的。即使您可以控制块的表示方式,您也可能不希望阻止某些序列出现在块中,因为这将是低效的——块平均需要更多空间。
唯一的另一种可能性是提前了解 <chunk 1> 结束和 <chunk 2> 开始的位置。这就是标题信息的来源。您可以在每个块上提供一个标题,说明该块将持续多长时间。另一种选择是在第一个块之前有一个标头,表示每个块的长度。
推荐阅读
- javascript - Knex JS“或”在 .where() 内?
- json - JSONDecodeError:期望值:使用 Json 的第 1 行第 1 列
- azure - Azure Blob 创建未触发 Azure 数据工厂事件触发器
- c# - 如何在基于 db 的多线程通知/电子邮件发件人中减少 CPU 使用率
- c - 一个处理数组元素的函数
- html - 在 Shiny 中的图像后添加换行符
- java - 如何从主类调用静态方法?
- python - 如何在keras中包装张量流RNNCell?
- sql-server - 计算新变量
- c# - 在 IIS8 上发布后,Web 配置中连接字符串的 ASPNET_REGIIS 加密不起作用