- 创建G722编码器
rtc::scoped_refptr<AudioEncoderFactory> factory = CreateBuiltinAudioEncoderFactory();
std::unique_ptr<AudioEncoder> encoder = factory->MakeAudioEncoder(9, {"G722", 8000, 1}, absl::nullopt);
- 初始化参数
int seqNum = 0;
qint64 timestamp = 0;
int ssrc = 100;
- 编码操作(对pcm数据进行编码)
rtc::Buffer buffer;
AudioEncoder::EncodedInfo info =
encoder->Encode(0,
rtc::ArrayView<const int16_t>((const int16_t *)pcm, pcmSize/2),
&buffer);
/* 数据有效性判断 */
if (info.encoder_type == AudioEncoder::CodecType::kOther)
return;
- 打包为RTP
// 对于连续的音频包,需要连续的timestamp。
timestamp += sizeof(int16_t) * encoder->NumChannels() * encoder->RtpTimestampRateHz()/100;
/* 创建rtp包 */
RtpPacket packet(nullptr);
packet.SetPayloadType(payloadType);
packet.SetSequenceNumber(seqNum);
packet.SetTimestamp(timestamp);
packet.SetSsrc(ssrc);
uint8_t *payload = packet.SetPayloadSize(buffer.size());
/* 装载rtp包的payload内容 */
memcpy(payload,
(const uint8_t *)buffer.data(),
buffer.size());