2013年6月28日 星期五

使用 WireShark 取出串流中的H.264封包,並進行撥放

以下將紀錄如何使用 wireshark 將串流中的封包取出,儲存為檔案之後,使其可利用一般播放器進行播放。


實驗步驟如下

1. 使用 wireshark 將封包存成 pcap

2. 使用 wireshark 打開儲存的 pcap 檔案

3. 透過以下操作,便可以將 pcap 檔案內的 RTP payload 內的資料全部輸出成一個檔案
 [Telephony] -> [RTP] -> [Stream Anaysis]

 Press [Save Payload]

 Press [OK]

4. 使用 Winhex 打開儲存後的檔案(2013-06-02-h264),與 wireshark 內的 RTP payload內容進行比較,可發現內容皆相同。

5. 直接使用 ffplay 或 VLC 進行撥放,無法正確撥放。

問題分析

如果取出的 RTP payload 是 G.711 ,可以直接使用 Wireshark 進行撥放,可參考wireshark提供的範例
但是我的目的是 H.264的串流,測試結果發現,雖然已經可以正確地將 RTP payload都存成檔案,但是並不會自動加上 start code (0x00000001),因此無法進行撥放。


想要將 h.264 的串流資料直接存成一個可以撥放的 H.264 檔案,根據網路搜尋的結果,目前已知有兩個方法,整理如下。

1. 透過 wireshark 將 pcap自行撰寫 LUA Script。
這裡有個lua例子子 http://blog.csdn.net/jasonhwang/article/details/7359095 ,但是只能夠捉出 RTP over UDP 的封包,執行結果如下:

註1:Wireshark 需先設定 edit-->preference--》protocol-->H264,填上 rtp dynamic payload type,例如:96,接著才能用此 Script 進行輸出。
註2:請使用administor權限執行 wireshark, 輸出後的檔案會放在 C:\Program Files\Wireshark\
2. 使用 videosnarf 工具程式。(這個方法我試不出來 :-(  )
使用下列指令 "videosnarf -i filename.pcap -c" ,  


參考資料

  1. https://supportforums.cisco.com/thread/2152741
  2. http://blog.csdn.net/jasonhwang/article/details/7359095
  3. http://ffmpeg-users.933282.n4.nabble.com/Extracing-H264-from-RTP-packets-td4654536.html
  4. http://www.it610.com/article/4493503.htm