2008年12月5日

如何將Wireshark擷取的封包內的G.729還原?

目前網路電話由於頻寬問題,多半採用G.729當作Codec,而此codec目前並非是open source的授權,所以處理起來較為麻煩,以下為codec還原的方式

前置準備
先下載 open G.729 的 decoder
Windows 下可使用 Goldwave
Linux 下可使用 Perl 的Script

整個轉檔流程大概需經過以下的手續:
Wireshark(raw) -> open G.729 decoder (pcm) -> Goldwave (wav) or perl script (au) -> 播放器


步驟1. Wireshark(raw)

選單 Statistics -> RTP -> Show All Streams, 進入後會找出總共有多少RTP Stream

















RTP封包解開通常會長成這個樣子
-- 2個主叫端的聲音
-- 1個被叫端的聲音

第一個主叫端為接通前的聲音,通常是響鈴或來電答鈴音樂
第二個為被叫端的聲音,也就是接通回應
第三個為主叫端的聲音,也是接通開始說話

選擇要還原的RTP再按 Analyze ,通常是依序一個一個解








接下來的畫面選擇 Save Payload....
再下個畫面
Format 選 .raw
Channel 選 forward
再命名為 filename.raw




















步驟2. open G.729 decoder (pcm)
此時再借助這個opensource的小程式,將raw檔轉成pcm格式
將G729.zip解開,進入Dos模式執行裡面的程式如下:
va_g729_decoder.exe 來源.raw 目的.pcm


步驟3.1 Goldwave (wav), Windows適用
將轉好的pcm檔用Goldwave打開,並選擇下面的格式,打開後即可直接播放或轉成wav檔













步驟3.2 Perl script (au) , Linux適用

請將以下的Perl script存檔,檔名為 pcm2au.pl
--------我是分隔線--------
#
# USAGE: perl pcm2au.pl inputFile outputFile


$usage = "Usage: 'perl $0 ' ";

$srcFile = shift @ARGV || die $usage;
$dstFile = shift @ARGV || die $usage;

open(SRCFILE, "$srcFile") || die "Unable to open file: $!\n";
binmode SRCFILE;

open(DSTFILE, "> $dstFile") || die "Unable to open file: $!\n";
binmode DSTFILE;

###################################
# Write the AU header
###################################

print DSTFILE ".snd";

$foo = pack("CCCC", 0,0,0,24);
print DSTFILE $foo;

$foo = pack("CCCC", 0xff,0xff,0xff,0xff);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0,3);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0x1f,0x40);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0,1);
print DSTFILE $foo;

#############################
# swap the PCM samples
#############################

while (read(SRCFILE, $inWord, 2) == 2) {

@bytes = unpack('CC', $inWord);
$outWord = pack('CC', $bytes[1], $bytes[0]);
print DSTFILE $outWord;
}

close(DSTFILE);
close(SRCFILE);

--------我是分隔線--------
然後再執行 perl pcm2au.pl 來源.pcm 目的.au
就可產生 au 檔了

PS1. G.711的話,Wireshark可以直接分析之後轉存為 au 檔,就可以直接播放了。
PS2. 參考資料: http://wiki.wireshark.org/HowToDecodeG729

沒有留言: