2014-10-31 119 views
1

使用Python的rtmplib綁定並遇到一些問題。解碼十六進制(?)數據包

首先,

我有這樣的事情:

import librtmp 

conn = librtmp.RTMP(...) 
conn.connect() 

while True: 
    packet = conn.read_packet().body 
    print packet 

這將打印數據包像圖所示:

example

對我來說,這看起來像十六進制,並寫入文件時,我得到4個字符串,如下所示:

0200 086f 6e42 5744 6f6e 6500 0000 0000 
0000 0000 0500 0000 0000 0000 0000 0200 
066e 6f74 6963 6500 0000 0000 0000 0000 
0502 0003 2a2a 2a02 000a 5072 6f63 6573 

所以我的問題是,我怎麼能把這變成一個真正的字符串(或緩衝區)只有可讀的文字?我已經嘗試了不同的東西來解碼十六進制,但結果是「\ x05」。

另外值得一提的是,當它寫入它包含很多00的。

任何人都知道我怎麼才能實現我早期以簡單但好的方式提出的問題?

在此先感謝。

回答

0

解決方案是librtmp.amf.decode_amf

import librtmp 

conn = librtmp.RTMP(...) 
conn.connect() 

while True: 
    packet = conn.read_packet().body 
    print packet 
    print librtmp.amf.decode_amf(packet) 

這是管理Python的librtmp包裝器的人指出的。

1

如果你不知道你會得到什麼,然後將數據保存到文件,並用查看器來看看它? (例如linux上的od)。

另外,如果你不知道你要接收什麼數據,那麼看看你是否找不到rtmp給你在線的格式描述。 (我想既然存在之類的東西RED5這應該被記錄在案)..和LO有一些文檔http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf

如果你知道你會得到你可以解開與結構內置庫 https://docs.python.org/2/library/struct.html

我的數據是什麼'有點驚訝librtmp不會給你高層次的解析對象。你不能成爲第一個想做這件事的人..所以看看是否有其他人有一個庫來處理這個問題。

+0

我在做一些研究後正在研究struct。使用'print repr(packet)'打印出更具可讀性的東西。感謝您的建議! – 2014-10-31 06:02:35

+0

不用擔心隊友 – 2014-10-31 06:03:20

+1

接受你的答案,也發現有一個函數叫做'librtmp.amf.decode_amf'來解碼它。愚蠢的我沒有想到AMF,當時我曾經使用過RTMP。 – 2014-12-21 14:24:43