【问题标题】:How to Pickle an MPEG .ts file如何腌制 MPEG .ts 文件
【发布时间】:2019-11-17 10:11:18
【问题描述】:

一位同事建议我构建自己的 ts 解析器,我想用 Python 来做(主要是帮助我学习这些东西并挑战自己)。我的同事提到我应该研究腌制 .ts 文件,然后将该腌制文件读入我的主要 Python 脚本。

我的同事给我的一个 .ts 的 pickle 文件的摘录如下所示(前 40 行),但我不知道如何实现这一点。

如果有人能指出正确的方向,我将不胜感激。

8004 95eb ab00 0000 0000 008c 1170 616e
6461 732e 636f 7265 2e66 7261 6d65 948c
0944 6174 6146 7261 6d65 9493 9429 8194
7d94 288c 055f 6461 7461 948c 1570 616e
6461 732e 636f 7265 2e69 6e74 6572 6e61
6c73 948c 0c42 6c6f 636b 4d61 6e61 6765
7294 9394 2981 9428 5d94 288c 1870 616e
6461 732e 636f 7265 2e69 6e64 6578 6573
2e62 6173 6594 8c0a 5f6e 6577 5f49 6e64
6578 9493 9468 0b8c 0549 6e64 6578 9493
947d 9428 8c04 6461 7461 948c 156e 756d
7079 2e63 6f72 652e 6d75 6c74 6961 7272
6179 948c 0c5f 7265 636f 6e73 7472 7563
7494 9394 8c05 6e75 6d70 7994 8c07 6e64
6172 7261 7994 9394 4b00 8594 4301 6294
8794 5294 284b 014b 0685 9468 158c 0564
7479 7065 9493 948c 024f 3894 4b00 4b01
8794 5294 284b 038c 017c 944e 4e4e 4aff
ffff ff4a ffff ffff 4b3f 7494 6289 5d94
284b 004b 654d e101 4dd6 074d ff1f 8c03
7375 6d94 6574 9462 8c04 6e61 6d65 944e
7586 9452 9468 0d8c 1b70 616e 6461 732e
636f 7265 2e69 6e64 6578 6573 2e6e 756d
6572 6963 948c 0a49 6e74 3634 496e 6465
7894 9394 7d94 2868 1168 1468 174b 0085
9468 1987 9452 9428 4b01 4d3b 1585 9468
1e8c 0269 3894 4b00 4b01 8794 5294 284b
038c 013c 944e 4e4e 4aff ffff ff4a ffff
ffff 4b00 7494 6289 42d8 a900 0001 0000
0000 0000 0002 0000 0000 0000 0003 0000
0000 0000 0004 0000 0000 0000 0005 0000
0000 0000 0006 0000 0000 0000 0007 0000
0000 0000 0008 0000 0000 0000 0009 0000
0000 0000 000a 0000 0000 0000 000b 0000
0000 0000 000c 0000 0000 0000 000d 0000
0000 0000 000e 0000 0000 0000 000f 0000
0000 0000 0010 0000 0000 0000 0011 0000
0000 0000 0012 0000 0000 0000 0013 0000
0000 0000 0014 0000 0000 0000 0015 0000
0000 0000 0016 0000 0000 0000 0017 0000

编辑:实际上没有必要进行这种酸洗。它没有任何帮助。因此,如果您正在阅读本文,则完全没有必要执行此步骤。但是,我选择不删除它,因为其他人可能会从我的痛苦和错误中吸取教训。此处不需要 Pickle,但它用于在应用程序之间移动对象或保存对象状态以供后续导入。我所做的只是将一个二进制变量转储到一个泡菜文件中,它对我没有任何帮助。

【问题讨论】:

  • pickle 文件格式不止一种——它取决于 Python 的版本和用于创建文件的协议——而且它们都没有公开记录。从理论上讲,您可以阅读模块源代码并弄清楚我想。如果您想将 pickle 文件读入脚本,那么只需使用模块中的适当函数加载它,这将取消它。见Saving an Object (Data persistence)
  • 我怀疑这不是您同事的想法。我怀疑他们的意思是您将 ts 文件解析为每帧某种结构,然后将其写回有效的 ts 文件。
  • @szatmary 谢谢,是的,我明白你的意思。我认为接下来的步骤将专注于读取 pickle 文件,然后检查一些要求以查看流是否符合要求,例如检查第一帧是否为 IDR(您之前帮助过我!)和类似的东西。

标签: python pickle mpeg


【解决方案1】:

所以我相信我已经回答了我自己的问题。感谢@martineau 帮助我了解pickle 有许多不同的文件格式。

这是我用来腌制 mpeg TS 文件的代码:

import pickle

with open("my_mpeg_ts_file.ts", "rb") as file_object:
    data = file_object.read()
    with open("my_pickle.pickle", "wb") as f:
        pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

这随后创建了一个名为 my_pickle.pickle 的文件! :) 这是这个漂亮的 pickle 文件的前 13 行:

8004 42a8 f89a 0f47 4000 1000 00b0 0d00
01c1 0000 000a e065 8d2c a3ec ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ff47 4065 1000 02b0 2000 0ac1 0000

我使用 tsduck 来确认我正在查看正确的数据。这是来自 tsduck 的 tsdump 实用程序的我的 mpeg ts 文件的第一个数据包:

* Packet 0
  ---- TS Header ----
  PID: 0 (0x0000), header size: 4, sync: 0x47
  Error: 0, unit start: 1, priority: 0
  Scrambling: 0, continuity counter: 0
  Adaptation field: no (0 bytes), payload: yes (184 bytes)
  ---- Full TS Packet Content ----
  47 40 00 10 00 00 B0 0D 00 01 C1 00 00 00 0A E0 65 8D 2C A3 EC FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

所以我可以看到这里有来自传输流的数据。但正如@szatmary 指出的那样,pickle 文件中似乎添加了额外的信息。

【讨论】:

  • 不正确。泡菜头是多余的垃圾,不需要添加到文件中。 tsduck 只是有一些错误处理,可能会跳过文件中的所有字节,直到找到同步字节。基本上,您正在破坏一个文件,而不是依赖另一个文件来检测和解决损坏!
  • 我该如何纠正这个问题?我腌制它的方式有什么问题?我知道我使用 tsduck 进行比较,那是因为我需要知道我正在查看的数据是否代表 ts 流的数据(这是我以前从未做过的事情,所以我想检查一下)。如果 tsduck 跳过所有字节直到一个同步字节,那不是我可以在我的 Python 脚本中使用的相同方法吗?
  • 你为什么要先腌制它?这解决了什么问题?您损坏了文件,希望以后可以处理它。为什么首先要破坏它?
  • 你如何纠正这个,而不是这样做,什么都不做。您误解了同事的建议。您必须首先了解您为什么要这样做,以及这些步骤如何帮助您实现该目标。
  • 新问题应该有新帖子。
猜你喜欢
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 2012-06-27
  • 2013-01-14
  • 2018-01-30
  • 1970-01-01
相关资源
最近更新 更多