WebRtc 音频引擎-linux demo

2024-08-21 18:08
文章标签 音频 linux 引擎 demo webrtc

本文主要是介绍WebRtc 音频引擎-linux demo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Google收购了著名的音频技术公司GIPS后,基于其强大的音频技术,实现了WebRtc的Voice Engine,即语音处理引擎。本文主要介绍WebRTC 中Voice Engine中音频技术相关的实现,并结合具体实例,介绍如何利用voice engine实现自己的VoIP音频处理引擎。

本文主要介绍如何在linux下搭建一个可以自己调试的基于WebRTC的voiceEngine。

1.VoiceEngine Demo 目录树

下面是一个小的VoiceEngine目录树:

[cpp]  view plain  copy
  1. .  
  2. ├── include  
  3. │   ├── channel_transport.h  
  4. │   ├── common_types.h  
  5. │   ├── typedefs.h  
  6. │   ├── udp_transport.h  
  7. │   ├── voe_audio_processing.h  
  8. │   ├── voe_base.h  
  9. │   ├── voe_call_report.h  
  10. │   ├── voe_codec.h  
  11. │   ├── voe_dtmf.h  
  12. │   ├── voe_encryption.h  
  13. │   ├── voe_errors.h  
  14. │   ├── voe_external_media.h  
  15. │   ├── voe_file.h  
  16. │   ├── voe_hardware.h  
  17. │   ├── voe_neteq_stats.h  
  18. │   ├── voe_network.h  
  19. │   ├── voe_rtp_rtcp.h  
  20. │   ├── voe_video_sync.h  
  21. │   └── voe_volume_control.h  
  22. ├── lib  
  23. │   ├── libaudio_coding_module.a  
  24. │   ├── libaudio_conference_mixer.a  
  25. │   ├── libaudio_device.a  
  26. │   ├── libaudioproc_debug_proto.a  
  27. │   ├── libaudio_processing.a  
  28. │   ├── libaudio_processing_sse2.a  
  29. │   ├── libchannel_transport.a  
  30. │   ├── libCNG.a  
  31. │   ├── libcommon_video.a  
  32. │   ├── libG711.a  
  33. │   ├── libG722.a  
  34. │   ├── libgtest.a  
  35. │   ├── libgtest_main.a  
  36. │   ├── libiLBC.a  
  37. │   ├── libiSAC.a  
  38. │   ├── libiSACFix.a  
  39. │   ├── libmedia_file.a  
  40. │   ├── libNetEq.a  
  41. │   ├── libopus.a  
  42. │   ├── libpaced_sender.a  
  43. │   ├── libPCM16B.a  
  44. │   ├── libprotobuf_lite.a  
  45. │   ├── libresampler.a  
  46. │   ├── librtp_rtcp.a  
  47. │   ├── libsignal_processing.a  
  48. │   ├── libsystem_wrappers.a  
  49. │   ├── libvad.a  
  50. │   ├── libvoice_engine_core.a  
  51. │   ├── libwebrtc_opus.a  
  52. │   └── libwebrtc_utility.a  
  53. ├── Makefile  
  54. ├── out  
  55. │   └── Debug  
  56. │       ├── client_recv  
  57. │       └── client_send  
  58. └── src  
  59.     ├── client_recv.cpp  
  60.     └── client_send.cpp  


 

其中,src目录下的client_send和client_recv是基于WebRTC VoiceEngine实现的两个Demo,一个发送音频数据、一个接收音频数据。

2.工程Makefile

下面是Voiceengine工程编译的Makefile文件

[cpp]  view plain  copy
  1. #WebRTC VoiceEngine Test => Makefile                                                                                                    
  2.   
  3. CC = g++   
  4. CFLAGS= -Wall -g  
  5. VPATH = src:include  
  6. lib= -L lib   
  7.   
  8. obj=out/Debug/client_send  out/Debug/client_recv  
  9.   
  10. depens= -lvoice_engine_core -laudio_device -lresampler \  
  11.         -laudio_conference_mixer\  
  12.         -laudio_processing  \  
  13.         -laudio_coding_module -lrtp_rtcp\  
  14.         -lNetEq -lCNG -lG722 -liLBC \  
  15.         -lG711 -liSAC -lPCM16B \  
  16.         -lsignal_processing \  
  17.         -lvad -laudioproc_debug_proto\  
  18.         -lprotobuf_lite -laudio_processing_sse2\  
  19.         -lwebrtc_opus -lopus  -lpaced_sender\  
  20.         -liSACFix -lmedia_file \  
  21.         -lwebrtc_utility -lchannel_transport -lgtest\  
  22.         -lpthread -lsystem_wrappers -lrt -ldl\  
  23.   
  24. all:${obj}  
  25.   
  26. out/Debug/client_send:client_send.cpp  
  27.         ${CC} ${CFLAGS} -o $@ $< -Iinclude  ${lib} ${depens}  
  28.           
  29. out/Debug/client_recv:client_recv.cpp   
  30.         ${CC} ${CFLAGS} -o $@ $< -Iinclude  ${lib} ${depens}  
  31.   
  32. .PHONY:clean  
  33. clean:  
  34.         rm -rf *.o ${obj}  


 

其中,静态库的链接顺序不能随便修改,由于静态库之间存在依赖关系。具体原因可以看这里

3.client_recv Demo

[cpp]  view plain  copy
  1. /* 
  2. *  WebRTC VoiceEngine Test => client_recv 
  3. *   
  4. *  @date:13.06.2013 
  5. *  @author:hongliang 
  6. *  @mail:lhl_nciae@sina.cn 
  7. */  
  8.   
  9. #include<iostream>  
  10. #include"voe_base.h"  
  11. #include"voe_network.h"  
  12. #include"voe_hardware.h"  
  13. #include"voe_errors.h""  
  14. #include"channel_transport.h"  
  15.   
  16.   
  17. using namespace webrtc;  
  18.   
  19. int main(int argc , char *argv[])  
  20. {  
  21.     //Create VoiceEngine  
  22.     VoiceEngine* voe = VoiceEngine::Create();  
  23.   
  24.     //Init base  
  25.     VoEBase* base = VoEBase::GetInterface(voe);  
  26.     base->Init();  
  27.   
  28.     //hardware  
  29.     VoEHardware* hardware = VoEHardware::GetInterface(voe);  
  30.   
  31.     int nRec = 0;  
  32.     char devName[128] = {0};  
  33.     char guidName[128] = {0};  
  34.     int ret = 0;  
  35.   
  36.     ret = hardware->GetNumOfRecordingDevices(nRec);  
  37.   
  38.     if(ret != 0)  
  39.     {  
  40.         std::cout << "GetNumOfRecordingDevice error:" << base->LastError() << std::endl;  
  41.     }  
  42.   
  43.     for (int idx = 0; idx < nRec; idx++)  
  44.     {  
  45.         hardware->GetRecordingDeviceName(idx , devName , guidName);  
  46.         std::cout << "GetRecordingDeviceName=> " << "name:" << devName << " guidname:" << guidName <<std::endl;  
  47.     }  
  48.   
  49.     //Create Channel  
  50.     int ch = base->CreateChannel();  
  51.     if(ch != -1)  
  52.     {  
  53.         std::cout << "Create channel #" << ch << std::endl;  
  54.     }  
  55.       
  56.     //Create Voice Channel transport  
  57.     VoENetwork* voe_network = VoENetwork::GetInterface(voe);  
  58.       
  59.     test::VoiceChannelTransport voe_vct = test::VoiceChannelTransport(voe_network , ch);  
  60.   
  61.     //recv  
  62.     voe_vct.SetLocalReceiver(12345);  
  63.     base->StartReceive(ch);  
  64.     base->StartPlayout(ch);  
  65.   
  66.     std::cout << "Start Receice from channel:" << ch << std::endl;  
  67.   
  68.     while(1)  
  69.     {  
  70.     }     
  71.       
  72.   
  73.     //Release resource  
  74.     base->DeleteChannel(ch);  
  75.     base->Terminate();  
  76.     base->Release();  
  77.     hardware->Release();  
  78.     VoiceEngine::Delete(voe);  
  79.   
  80.     return 0;  
  81. }  


 

4.client_send Demo

[cpp]  view plain  copy
  1. #include<iostream>  
  2. #include"voe_base.h"  
  3. #include"voe_network.h"  
  4. #include"voe_hardware.h"  
  5. #include"voe_errors.h"  
  6. #include"voe_rtp_rtcp.h"  
  7. #include"channel_transport.h"  
  8.   
  9. using namespace webrtc;  
  10.   
  11. int main(int argc ,char * argv[])  
  12. {  
  13.     int ret;  
  14.     //Create VoiceEngine  
  15.     VoiceEngine *voe = VoiceEngine::Create();  
  16.   
  17.     //Init base  
  18.     VoEBase* base = VoEBase::GetInterface(voe);  
  19.     base->Init();  
  20.   
  21.     //handware  
  22.     int nRec = 0;  
  23.     char devName[128] = {0};  
  24.     char guidName[128] = {0};  
  25.       
  26.     VoEHardware* hardware = VoEHardware::GetInterface(voe);  
  27.     hardware->GetNumOfRecordingDevices(nRec);  
  28.     std::cout << "Get num of recordingdevice:" << nRec << std::endl;    
  29.     for(int idx = 0; idx < nRec; idx++)  
  30.     {  
  31.         hardware->GetRecordingDeviceName(idx , devName , guidName);  
  32.         std::cout << "GetRecordingName(" << idx << ")  " << "name:" << devName << "  guidName:" << guidName << std::endl;  
  33.     }  
  34.   
  35.     //Create Channel  
  36.     int ch = base->CreateChannel();  
  37.     if(ch == -1)  
  38.     {  
  39.         std::cout << "create channel error:" << base->LastError() << std::endl;  
  40.         return -1;  
  41.     }     
  42.   
  43.     std::cout << "create channel#" << ch << std::endl;  
  44.     //Create Voice Channel transport  
  45.     VoENetwork* voe_network = VoENetwork::GetInterface(voe);  
  46.       
  47.     test::VoiceChannelTransport voe_ctp = test::VoiceChannelTransport(voe_network , ch);  
  48.   
  49.     //send  
  50.     voe_ctp.SetSendDestination("192.168.1.1" , 12345);  
  51. //  base->SetSendDestination(ch , "192.168.1.1" , 12345);  
  52.   
  53.     ret = base->StartSend(ch);     
  54.     if(ret == -1)  
  55.     {  
  56.         std::cout << "Start send error:" << base->LastError() << std::endl;  
  57.         return -1;  
  58.     }  
  59.   
  60.     std::cout << "Start send on channel#" << ch << std::endl;  
  61.   
  62.     //Release Resource  
  63.     base->DeleteChannel(ch);  
  64.     base->Terminate();  
  65.     hardware->Release();  
  66.     VoiceEngine::Delete(voe);  
  67.   
  68.     return 0;  
  69. }  


 

 

这篇关于WebRtc 音频引擎-linux demo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093896

相关文章

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Linux编译器--gcc/g++使用方式

《Linux编译器--gcc/g++使用方式》文章主要介绍了C/C++程序的编译过程,包括预编译、编译、汇编和链接四个阶段,并详细解释了每个阶段的作用和具体操作,同时,还介绍了调试和发布版本的概念... 目录一、预编译指令1.1预处理功能1.2指令1.3问题扩展二、编译(生成汇编)三、汇编(生成二进制机器语

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li

Linux部署jar包过程

《Linux部署jar包过程》文章介绍了在Linux系统上部署Java(jar)包时需要注意的几个关键点,包括统一JDK版本、添加打包插件、修改数据库密码以及正确执行jar包的方法... 目录linux部署jar包1.统一jdk版本2.打包插件依赖3.修改密码4.执行jar包总结Linux部署jar包部署

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2