G.729 使用single channel, 16bit 的sample,8000 sample per second 的PCM格式作为输入源, 即:
WAVEFORMATEX waveformat;
waveformat.wFormatTag = WAVE_FORMAT_PCM;
waveformat.nChannels = 1 ;
waveformat.nSamplesPerSec = 8000 ;
waveformat.wBitsPerSample = 16 ;
waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * (waveformat.wBitsPerSample / 8 );
waveformat.nBlockAlign = waveformat.nChannels * (waveformat.wBitsPerSample / 8 );
waveformat.cbSize = 0 ;
waveformat.wFormatTag = WAVE_FORMAT_PCM;
waveformat.nChannels = 1 ;
waveformat.nSamplesPerSec = 8000 ;
waveformat.wBitsPerSample = 16 ;
waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * (waveformat.wBitsPerSample / 8 );
waveformat.nBlockAlign = waveformat.nChannels * (waveformat.wBitsPerSample / 8 );
waveformat.cbSize = 0 ;
G.729 is a frame based encoding 10ms/frame, 16:1 compress rate,就是形成一个frame的数据需要10ms的sample.对于上述PCM格式来说,音频驱动会产生 8000 samples * (16 bit/s / 8 bit/bytes) = 16000 byte/s 就是说 一秒钟内音频驱动产生16000 bytes, 就是一毫秒产生16个字节
于是作为G.729的输入源的数据大小应该为 160byte的倍数, 就是说产生一个G.729的frame (这个frame 10 byte)需要输入160 byte的数据。
含有G.729的RTP包中payload根据RFC3551应该是2个frame,就是默认传输G.729的每个RTP包中有20Bytes=2frame的净负载