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磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

Linux使用粘滞位 (t-bit)共享文件的方法教程

《Linux使用粘滞位(t-bit)共享文件的方法教程》在Linux系统中,共享文件是日常管理和协作中的常见任务,而粘滞位(StickyBit或t-bit)是实现共享目录安全性的重要工具之一,本文将... 目录文件共享的常见场景基础概念linux 文件权限粘滞位 (Sticky Bit)设置共享目录并配置粘