1、VoiceEngine Codec数据结构
WebRTC中,用一个结构体struct CodecInst表示特定的音频编解码器对象:
- struct CodecInst
- {
- int pltype; //payload type负载类型
- char plname[32]; //payload name负载名称,32个字符表示
- int plfreq; //payload frequence负载频率
- int pacsize; //packet size包大小
- int channels; //声道
- int rate; //速率或自适应
- };
参数详细说明:
1、 pltype范围在1~126之间才是有效值;
pltype的值是否有效可以通过调用下面ValidPayloadType(int payload_type)方法来判断,在...\src\modules\audio_coding\main\source\acm_codec_database.cc定义
- // Checks if the payload type is in the valid range.
- bool ACMCodecDB::ValidPayloadType(int payload_type) {
- if ((payload_type < 0) || (payload_type > 127)) {
- return false;
- }
- return true;
- }
2、 plname是编解码器的名称,可能的值在CreateCodecInstance已定义,如WebRTC默认的"ISAC"
VoiceEngine支持多个音频编解码器,具体支持的编解码器在CreateCodecInstance(const CodecInst* codec_inst)定义,比如ISAC\PCMU\PCMA\ILBC\AMR等等,在...\src\modules\audio_coding\main\source\acm_codec_database.cc定义
- ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst* codec_inst) {
- // All we have support for right now.
- if (!STR_CASE_CMP(codec_inst->plname, "ISAC")) {
- #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
- return new ACMISAC(kISAC);
- #endif
- } else if (!STR_CASE_CMP(codec_inst->plname, "PCMU")) {
- return new ACMPCMU(kPCMU);
- } else if (!STR_CASE_CMP(codec_inst->plname, "PCMA")) {
- return new ACMPCMA(kPCMA);
- } else if (!STR_CASE_CMP(codec_inst->plname, "ILBC")) {
- #ifdef WEBRTC_CODEC_ILBC
- return new ACMILBC(kILBC);
- #endif
- } else if (!STR_CASE_CMP(codec_inst->plname, "AMR")) {
- #ifdef WEBRTC_CODEC_AMR
- return new ACMAMR(kGSMAMR);
- #endif
- } else if (!STR_CASE_CMP(codec_inst->plname, "AMR-WB")) {
- #ifdef WEBRTC_CODEC_AMRWB
- return new ACMAMRwb(kGSMAMRWB);
- #endif
- } else if (!STR_CASE_CMP(codec_inst->plname, "G722")) {
- #ifdef WEBRTC_CODEC_G722
- return new ACMG722(kG722);
- #endif
- } else if (!STR_CASE_CMP(codec_inst->plname, "G7221")) {
- switch (codec_inst->plfreq) {
- case 16000: {
- #ifdef WEBRTC_CODEC_G722_1
- int codec_id;
- switch (codec_inst->rate) {
- case 16000 : {
- codec_id = kG722_1_16;
- break;
- }
- case 24000 : {
- codec_id = kG722_1_24;
- break;
- }
- case 32000 : {
- codec_id = kG722_1_32;
- break;
- }
- default: {
- return NULL;
- }
- return new ACMG722_1(codec_id);
- }
- #endif
- }
- case 32000: {
- #ifdef WEBRTC_CODEC_G722_1C
- int codec_id;
- switch (codec_inst->rate) {
- case 24000 : {
- codec_id = kG722_1C_24;
- break;
- }
- case 32000 : {
- codec_id = kG722_1C_32;
- break;
- }
- case 48000 : {
- codec_id = kG722_1C_48;
- break;
- }
- default: {
- return NULL;
- }
- return new ACMG722_1C(codec_id);
- }
- #endif
- }
- }
- } else if (!STR_CASE_CMP(codec_inst->plname, "CN")) {
- // For CN we need to check sampling frequency to know what codec to create.
- int codec_id;
- switch (codec_inst->plfreq) {
- case 8000: {
- codec_id = kCNNB;
- break;
- }
- case 16000: {
- codec_id = kCNWB;
- break;
- }
- case 32000: {
- codec_id = kCNSWB;
- break;
- }
- default: {
- return NULL;
- }
- }
- return new ACMCNG(codec_id);
- } else if (!STR_CASE_CMP(codec_inst->plname, "G729")) {
- #ifdef WEBRTC_CODEC_G729
- return new ACMG729(kG729);
- #endif
- } else if (!STR_CASE_CMP(codec_inst->plname, "G7291")) {
- #ifdef WEBRTC_CODEC_G729_1
- return new ACMG729_1(kG729_1);
- #endif
- } else if (!STR_CASE_CMP(codec_inst->plname, "speex")) {
- #ifdef WEBRTC_CODEC_SPEEX
- int codec_id;
- switch (codec_inst->plfreq) {
- case 8000: {
- codec_id = kSPEEX8;
- break;
- }
- case 16000: {
- codec_id = kSPEEX16;
- break;
- }
- default: {
- return NULL;
- }
- }
- return new ACMSPEEX(codec_id);
- #endif
- } else if (!STR_CASE_CMP(codec_inst->plname, "CN")) {
- // For CN we need to check sampling frequency to know what codec to create.
- int codec_id;
- switch (codec_inst->plfreq) {
- case 8000: {
- codec_id = kCNNB;
- break;
- }
- case 16000: {
- codec_id = kCNWB;
- break;
- }
- case 32000: {
- codec_id = kCNSWB;
- break;
- }
- default: {
- return NULL;
- }
- }
- return new ACMCNG(codec_id);
- } else if (!STR_CASE_CMP(codec_inst->plname, "L16")) {
- #ifdef WEBRTC_CODEC_PCM16
- // For L16 we need to check sampling frequency to know what codec to create.
- int codec_id;
- switch (codec_inst->plfreq) {
- case 8000: {
- codec_id = kPCM16B;
- break;
- }
- case 16000: {
- codec_id =kPCM16Bwb;
- break;
- }
- case 32000: {
- codec_id = kPCM16Bswb32kHz;
- break;
- }
- default: {
- return NULL;
- }
- }
- return new ACMPCM16B(codec_id);
- #endif
- } else if (!STR_CASE_CMP(codec_inst->plname, "telephone-event")) {
- #ifdef WEBRTC_CODEC_AVT
- return new ACMDTMFPlayout(kAVT);
- #endif
- } else if (!STR_CASE_CMP(codec_inst->plname, "red")) {
- #ifdef WEBRTC_CODEC_RED
- return new ACMRED(kRED);
- #endif
- }
- return NULL;
- }
3、 plfreq一般取如下值(在common_types.h定义);
- //负载频率值
- enum PayloadFrequencies
- {
- kFreq8000Hz = 8000,
- kFreq16000Hz = 16000,
- kFreq32000Hz = 32000
- };
4、 pacsize取值是与plfreq有关系的,单位为kbps,下面是计算公式
计算公式如下:
如果:plfreq = 16000(单位为hz)
如果我需要30ms(毫秒)的packet size
那么pacsize = (plfreq *30) /1000 = 480kbps;
也即是:要得到k ms的packet size,则可计算出
pacsize =( plfreq * k) / 1000
而如果plfreq = 32000;20ms的packet size,则pacsize = 640;
5、 channels取值
channels = 1 表示单声道
channels = 2 表示立体声道
注意:channels = -1时,表示此时只支持单声道模式
6、 rate取值,单位是bps
一般取rate = 16000,32000,48000这些16000整数倍的值,即16kbps,32kbps,48kpbs
注意:当rate = -1时,表示此时启动自适应信道速率
2、查看VoiceEngine支持的所有Codec信息示例代码
- //列出(获得)引擎支持的所有编解码器信息
- //支持平台:Windows, Mac OS X, Linux
- #include "voe_base.h"
- #include "voe_codec.h"
- VoiceEngine* ve = VoiceEngine::Create();
- VoECodec* codec = VoECodec::GetInterface(ve);
- for (int = 0; i < codec->NumOfCodecs(); i++)
- {
- CodecInst cinst;
- codec->GetCodec(i, cinst);
- DISPLAY_CODEC_INFO(i, cinst);
- }
- // 释放sub-API
- codec->Release();
- //删除引擎
- VoiceEngine::Delete(ve);
3、初始化VoiceEngine Codec示例代码
- //初始化VoiceEngine Codec示例代码
- //支持平台:Windows, Mac OS X, Linux
- #include "voe_codec.h"
- CodecInst cinst;
- //初始化iSAC编解码器参数
- strcpy(cinst.plname, "ISAC");
- cinst.plfreq = 16000; // iSAC宽带模式取样频率
- cinst.pltype = 103;
- cinst.pacsize = 480; //使用30ms packet size,480kbps
- cinst.channels = 1; // 单声道
- cinst.rate = -1; // 信道自适应模式
- //初始化完成
- //在ID为0的channel激活已初始化的iSAC
- codec->SetSendCodec(0, cinst);
相关推荐
这个"webrtc-audio-processing-1.0例子"压缩包包含了一个关于WebRTC音频处理的实例,提供了源代码以及音频测试文件,帮助开发者更好地理解和使用WebRTC中的音频处理功能。 1. **WebRTC音频处理** WebRTC音频处理...
此技术广泛应用于视频会议、在线教育、远程医疗等场景,为互联网用户提供了无缝的音视频交互体验。在"webrtc-streamer-v0.8.1-dirty-Windows-AMD64-Release.zip"这个压缩包中,我们看到的是一个针对Windows操作系统...
《WebRTC音视频实时互动技术》大纲覆盖了WebRTC的核心技术和实践应用,旨在帮助读者深入理解这一实时通信技术。以下是对大纲中重要知识点的详细解释: 1. 音视频服务质量: - 带宽管理:为了确保高质量的音视频...
2. **WebRTC架构**:WebRTC包含一系列组件,如音频引擎、视频引擎、信令、数据通道等。VAD是音频引擎的一部分,负责音频流的预处理。在Android上,VAD通常是作为C++库实现,需要通过JNI接口与Java层交互。 3. **...
WebRTC(Web Real-Time Communication)是谷歌开发的一个开源项目,旨在提供浏览器间的实时通信能力,包括音频、视频和数据共享。这个技术的核心是允许在没有插件或第三方软件的情况下进行P2P通信,只需借助现代...
【标签】"webrtc" 明确地指出这个项目的核心技术是WebRTC,这是一种由谷歌发起并被W3C和IETF标准化的技术,用于实现浏览器之间的实时音频、视频和数据共享。WebRTC 支持P2P(点对点)通信,减少了服务器的负载,并且...
总的来说,WebRTC-streamer是一个强大的工具,结合WebRTC技术,可以帮助开发者快速构建实时音视频应用,尤其是在Windows环境下,它提供了便捷的集成方案。理解WebRTC的基本原理和相关协议,以及如何配置和使用WebRTC...
WebRTC(Web Real-Time Communication)是一项开源项目,旨在提供浏览器和移动应用程序之间的实时通信功能,包括音频、视频和数据共享。在"WebRTC音频降噪C语言开发代码"这个主题中,我们主要关注的是WebRTC如何利用...
基于WebRTC的Android版音频引擎(VoiceEngine)源代码,支持AGC/EC/NS,支持RTP/SRTP,支持iLBC/iSAC/PCMU/PCMA等,可以联系dotphoenix@qq.com获得帮助
它处理音频、视频的传输,以及信令(signaling),即用于协商连接参数的通信过程。在webrtc.io-demo中,RTCPeerConnection被用来创建和管理两端之间的媒体流交换。 2. **RTCDataChannel**:这是一个在两个浏览器...
webRTC接口文档 中文
这些示例通常会展示如何设置音视频流、如何处理连接以及如何进行数据传输。 在`webrtc.io-demo-master`文件夹中,你可能会发现以下内容: 1. **HTML文件**:这些文件展示了如何在网页中嵌入WebRTC和webrtc.io的...
WebRTC语音引擎中NetEQ技术的研究 找了好久可以下载的文档,辗转从caj类型转换为pdf。有需要的人学习。
首先,`webrtc_streaming`库可能包含了处理WebRTC协议的模块,这些模块负责设置音视频数据的编码、解码,以及与网络传输相关的功能。它可能提供了接口来创建和管理WebRTC的数据通道,以便于在客户端之间传输音视频流...
WebRTC(Web Real-Time Communication)是一种开放源代码项目,它为网页浏览器和其他应用程序提供了实时通信(RTC)的能力,包括音频、视频以及数据共享。在这个"webrtc-based-android-aec.rar"压缩包中,我们主要...
在Android平台上实现音频降噪功能,WebRTC是一个强大的开源项目,它提供了实时通信(RTC)的基础设施,包括音频和视频的编码、解码以及网络传输等。本项目专注于WebRTC中的噪声抑制(NS)模块,将它独立出来并编译为...
在WebRTC架构中,包括了一系列的API接口,使得开发者能够在不依赖任何插件的情况下,在浏览器中直接进行音视频的捕捉、编码、传输以及渲染。WebRTC的出现,极大地提升了Web应用的交互性与实时性。 WebRTC在浏览器中...
该教程包含了webrtc音视频入门与实战,视频教程,带源码和工程项目。包含了webrtc运行机制原理与架构,web服务器原理与搭建Nodejs开发环境,webrtc音视频设备管理,webrtc集成socket开发及时聊天室等教程 该资源来源...
这个技术的核心在于提供音视频通信的基础设施,包括数据传输、音频处理、视频编码和解码以及网络传输协议等。在本“WebRTC语音视频通话demo”中,我们将探讨WebRTC如何实现网页端和移动端的语音和视频通话功能。 ...