对于包含多个 MP4 文件的文件,什么是好的分隔符?

What would be a good separator look like for a file containing multiple MP4 files?

我目前正在尝试通过简单地合并来自多个视频文件(确切地说是 .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 级的极小文件或错误地将较大的文件分割成较小的文件。

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

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

直觉上,假设我们有两个要表示的信息块,一个接一个。

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

唯一的另一种可能性是提前了解 结束位置和 开始位置。这就是 header 信息的用武之地。您可以在每个块上提供一个 header,说明该块将有多长。另一种选择是在第一个块之前有一个 header 来说明每个块的长度。