Python 解析多组视频帧的原始二进制文件

Python 解析多组视频帧的原始二进制文件,python,parsing,multiplexing,Python,Parsing,Multiplexing,我正试图用Python解析一个原始二进制文件,其中包含已知的头和长度 数据为6通道多路复用视频 该文件遵循以下规则来分隔帧: 字节1:表示通道(例如0xE0、0xE1、0xE2…) 字节4和5:表示图像数据的长度 字节6:长度:图像数据 图像数据的末尾用0xFF填充,以便每个图像块从16字节行中的第一个字节开始 图像数据的开始 E0 01 00 00 D2 59 80 C1 27 3F EC BB 31 7B 3F EC BB 31 7B 0F 9B 90 5D A8 81 AA 5F

我正试图用Python解析一个原始二进制文件,其中包含已知的头和长度

数据为6通道多路复用视频

该文件遵循以下规则来分隔帧:

  • 字节1:表示通道(例如0xE0、0xE1、0xE2…)
  • 字节4和5:表示图像数据的长度
  • 字节6:长度:图像数据
  • 图像数据的末尾用0xFF填充,以便每个图像块从16字节行中的第一个字节开始
图像数据的开始

E0 01 00 00 D2 59 80 C1 27 3F EC BB 31 7B 3F EC 

BB 31 7B 0F 9B 90 5D A8 81 AA 5F A9 C1 D2 4B B9

9D 0A 8D 1B 8F 89 44 FF 4E 86 92 AD 00 90 5B A8
67 49 0B B5 BC 82 38 AE 5E 46 49 86 6A FF 24 97 

69 8C 6F 17 6D 67 B5 11 C7 E5 FB E3 3F 65 1F 22 

5C F3 7C D0 7C 49 2F CD 26 37 4D 40 FF FF FF FF
图像数据结束

E0 01 00 00 D2 59 80 C1 27 3F EC BB 31 7B 3F EC 

BB 31 7B 0F 9B 90 5D A8 81 AA 5F A9 C1 D2 4B B9

9D 0A 8D 1B 8F 89 44 FF 4E 86 92 AD 00 90 5B A8
67 49 0B B5 BC 82 38 AE 5E 46 49 86 6A FF 24 97 

69 8C 6F 17 6D 67 B5 11 C7 E5 FB E3 3F 65 1F 22 

5C F3 7C D0 7C 49 2F CD 26 37 4D 40 FF FF FF FF

源文件有几GB大。将每个通道解析为单独文件的最佳方式是什么?此外,如何一次批处理多个文件,并根据输入名称保存文件?

解析多GB二进制文件的小块可能不是Python会做得很快,因为它需要大量的函数调用和对象创建,这意味着大量的RAM和CPU开销。如果你需要更多的内存管理或性能控制,最好用较低级别的语言(C,C++,GO,RISE)来完成。 但是,您可以使用模块在Python中执行此类操作,如下所示:

header = struct.Struct('>BBBH')
data = b'\xE0\x01\x00\x00\xD2\x59\x80...'  # read this from input file
view = memoryview(data)
offset = 0
while offset < len(data):
    channel, _, _, length = header.unpack(view[offset:offset + header.size])
    write_output(channel, view[header.size:header.size + length])
    offset += length
header=struct.struct('>BBBH')
data=b'\xE0\x01\x00\x00\xD2\x59\x80…'#从输入文件中读取
视图=内存视图(数据)
偏移量=0
当偏移量
注意事项:

  • 确定长度是大端还是小端(
    格式字符串)
  • 使用是一种避免一些额外的对象复制和创建的方法——希望它能使这更有效
  • 您需要保持输出文件的打开状态——我刚刚将其隐藏在上面的
    write\u output()
    后面
  • 如果输入是多GB的,您可能希望以1MB的块或其他合理的方式读取输入文件,而不是一次读取所有文件
  • 注意字节和字符串(Python2.x和3.x上的不同处理方式)
  • 如果您需要了解更多有关打开、阅读和编写文件的信息,请随时发布更具体的问题

就一次批处理多个文件而言,最好的选择是模块。这确实需要一段时间才能让你的头脑清醒过来,但在那之后,它的使用就相当简单了。

解析多GB二进制文件的小块可能不是Python会很快做到的事情,因为它需要大量的函数调用和对象创建,这意味着大量的RAM和CPU开销。如果你需要更多的内存管理或性能控制,最好用较低级别的语言(C,C++,GO,RISE)来完成。 但是,您可以使用模块在Python中执行此类操作,如下所示:

header = struct.Struct('>BBBH')
data = b'\xE0\x01\x00\x00\xD2\x59\x80...'  # read this from input file
view = memoryview(data)
offset = 0
while offset < len(data):
    channel, _, _, length = header.unpack(view[offset:offset + header.size])
    write_output(channel, view[header.size:header.size + length])
    offset += length
header=struct.struct('>BBBH')
data=b'\xE0\x01\x00\x00\xD2\x59\x80…'#从输入文件中读取
视图=内存视图(数据)
偏移量=0
当偏移量
注意事项:

  • 确定长度是大端还是小端(
    格式字符串)
  • 使用是一种避免一些额外的对象复制和创建的方法——希望它能使这更有效
  • 您需要保持输出文件的打开状态——我刚刚将其隐藏在上面的
    write\u output()
    后面
  • 如果输入是多GB的,您可能希望以1MB的块或其他合理的方式读取输入文件,而不是一次读取所有文件
  • 注意字节和字符串(Python2.x和3.x上的不同处理方式)
  • 如果您需要了解更多有关打开、阅读和编写文件的信息,请随时发布更具体的问题

就一次批处理多个文件而言,最好的选择是模块。这需要花一段时间来让你的头脑清醒,但是之后使用它很简单。

你建议在C++中使用什么?我从未广泛使用C++中的IOFFROW,所以我个人可能在C中使用它,并且只使用Fund()、Frad()使用一个无符号字符(字节)缓冲区。在一个时间或什么东西上读64KB或1MB。你建议在C++中使用什么?我从未广泛使用C++中的IOFFROW,所以我个人可能在C中使用它,而只使用Fund()、Frad()使用一个无符号字符(字节)缓冲区。一次读64KB或1MB之类的。