Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何Pickle一个MPEG.ts文件_Python_Pickle_Mpeg - Fatal编程技术网

Python 如何Pickle一个MPEG.ts文件

Python 如何Pickle一个MPEG.ts文件,python,pickle,mpeg,Python,Pickle,Mpeg,一位同事建议我构建自己的ts解析器,我想用Python来实现这一点(主要是帮助我学习这方面的知识并挑战自己)。我的同事提到我应该研究pickle.ts文件,然后将该pickle文件读入我的主Python脚本 下面是我的同事给我的一个.ts pickle文件的摘录(前40行),但我不知道如何实现这一点 如果有人能给我指出正确的方向,我将不胜感激 8004 95eb ab00 0000 0000 008c 1170 616e 6461 732e 636f 7265 2e66 7261 6d65 94

一位同事建议我构建自己的ts解析器,我想用Python来实现这一点(主要是帮助我学习这方面的知识并挑战自己)。我的同事提到我应该研究pickle.ts文件,然后将该pickle文件读入我的主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文件中,它对我毫无帮助。

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

下面是我用来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文件中似乎添加了额外的信息。

有多种pickle文件格式——这取决于Python版本和用于创建文件的协议——而且没有公开的文档记录。理论上,我想你可以阅读模块的源代码并把它弄明白。如果您想将pickle文件读入脚本,那么只需使用模块中的相应函数加载它,该模块将取消pickle文件。我怀疑这不是你同事的想法。我猜想他们的意思是将ts文件解析为每帧的某种结构,然后将其写回有效的ts文件。@szatmary谢谢,是的,我明白你的意思。我认为下一步的重点将是读取pickle文件,然后对照一些要求检查流是否符合要求,例如检查第一帧是否为IDR(您以前曾帮助过我!)之类的内容。这是不正确的。pickle头是额外的垃圾,不需要添加到文件中。tsduck只是有一些错误处理,可能会跳过文件中的所有字节,直到is找到一个同步字节。基本上,您是在破坏一个文件,而不是依赖另一个文件来检测和解决损坏问题!我怎样才能纠正这个问题?我腌制它的方式出了什么问题?我知道我使用tsduck进行比较,这是因为我需要知道我正在查看的数据是否代表ts流的数据(这是我以前从未做过的事情,所以我想检查)。如果tsduck跳过所有字节直到一个同步字节,这不是我在Python脚本中可以使用的相同方法吗?为什么要首先对它进行酸洗?这能解决什么问题?你破坏了文件,希望以后能有办法处理。首先为什么要破坏它?你如何纠正这一点,就是不做这件事,什么也不做。你误解了同事的建议。你必须首先理解你为什么要这样做,以及这些步骤如何帮助你实现这个目标。新的问题应该得到新的帖子。