带音视频交互的flash项目中,音频编码只能选择speex格式。 这篇文章分为三部分。分别为flex中提供的音频接口、RTMP中的speex数据、如何转换为RTP流。
一、flex中提供的音频接口 用flex编写客户端,它提供的接口是封装过的,与speex标准编解码器之间的调用实际上相当于一个黑盒,它们之间的差异需要我们分析。 麦克风音频的接口由类Mircophone提供,大多都有中文注释,我就不一一赘述了,只挑出其中一些做自己的讲解。
speex编码有三种模式
二、RTMP中的speex数据 每个音频包(相当于FLV中的audiotag)中,第一个字节的前四位表示编码格式,等于11说明为speex编码。后4个字节分别表示编码采样率、单声道or立体声、每个sample大小8位or16位。但采用speex编码时,它们是固定不变的,协议中的为无效数据。编码采样率恒为16khz,单声道,16bit/sample。 剩余的数据为音频帧数据,可以为多帧的集合,取决于前文提到过的framesPerPacket。在flex中的默认值为2,故每个音频包中有两帧数据。注意,当前文所说的VAD功能开启时,两帧数据可以是两帧实际数据,也可以是两帧10字节数据,还可以各占一帧。
三、如何转换为RTP流 完成上面两步,这部分的工作就不难了。将音频帧数据打上RTP头就行了。具体参加rfc5574(rtp_payload_format_for_the_speex_codec)。 唯一值得注意的一点是,在RTMP协议中,音频数据的间隔是用时间做单位的,而RTP中的时间戳(timestamp),是sample数量。故当RTMP中两包音频包相差20MS时,RTP的时间戳就应该加上320(加320是因为恒采用16khz编码采样率)。 |
|