首页 > 解决方案 > 对于包含多个 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 填充极小的文件或错误地将较大的文件拆分为小文件。

所以我试图寻找一种方法在这些二进制流之间实现一个分隔块,以便它与文件数据区分开来,并且如果它没有被完整读取,也不容易失败。这样做的好方法是什么?谢谢。

标签: pythonfilefile-type

解决方案


这项工作面临着信息编码和通信方式的基本限制,这些限制在信息理论和通信理论领域进行了正式研究。

直观地说,假设我们有两块要表示的信息,一个接一个。

一种可能性是将其编码为 <chunk 1> <-separator-> <chunk 2>。这仅在 <chunk 1> 和 <chunk 2> 不包含 <-separator-> 时有效。如果块是任意二进制文件,假设它们不包含匹配 <-separator-> 的序列是不安全的。即使您可以控制块的表示方式,您也可能不希望阻止某些序列出现在块中,因为这将是低效的——块平均需要更多空间。

唯一的另一种可能性是提前了解 <chunk 1> 结束和 <chunk 2> 开始的位置。这就是标题信息的来源。您可以在每个块上提供一个标题,说明该块将持续多长时间。另一种选择是在第一个块之前有一个标头,表示每个块的长度。


推荐阅读