当前位置: 首页 > news >正文

Web语音对讲示例

PCM文件生成
1. 在线语音合成 https://ttsmaker.cn/
2. 音频转码 ffmpeg.exe -i test.mp3 -f s16le -ar 8000 -ac 1 -vn output.pcm

 

RTP播放测试
新建stream.sdp文件,使用vlc打开该文件,如8kHz 单声道 16-bit:

v=0
o=- 0 0 IN IP4 127.0.0.1
s=PCM Audio Stream
c=IN IP4 127.0.0.1
t=0 0
m=audio 5004 RTP/AVP 96
a=rtpmap:96 L16/8000/1

 

技术实现

流媒体:SDP流媒体信息、RTP打包、RTP解包

通信层:websocket

界面层:Html获取麦克风音频数据,播放PCM音频

 

代码结构

image

image

media.sdp

v=0
o=- 0 0 IN IP4 127.0.0.1
s=RTP PCM Audio Stream
c=IN IP4 127.0.0.1
t=0 0
m=audio 5504 RTP/AVP 96
a=rtpmap:96 L16/8000/1

talk_G711Alaw.sdp

v=0
o=- 0 0 IN IP4 127.0.0.1
s=s=RTP G711 Audio Stream
c=IN IP4 127.0.0.1
t=0 0
m=audio 5004 RTP/AVP 8
a=rtpmap:8 PCMA/8000

talk_PCM.sdp

v=0
o=- 0 0 IN IP4 127.0.0.1
s=s=RTP G711 Audio Stream
c=IN IP4 127.0.0.1
t=0 0
m=audio 5004 RTP/AVP 96
a=rtpmap:96 L16/8000/1
using System.Net;
using System.Net.Sockets;namespace RTPService.rtp
{public class RtpStreamer{private UdpClient udpClient;private IPEndPoint remoteEndPoint;private RtpPacketizer packetizer;private int frameSize;private int sampleRate;private int channel;private int bytesPerSample;public RtpStreamer(string remoteAddress, int remotePort, uint ssrc, int sampleRate = 8000, int bitDepth = 16, int channel = 1, byte payloadType = 96, bool isBigEndian = false){udpClient = new UdpClient();remoteEndPoint = new IPEndPoint(IPAddress.Parse(remoteAddress), remotePort);this.sampleRate = sampleRate;this.channel = channel;this.bytesPerSample = bitDepth / 8;packetizer = new RtpPacketizer(ssrc, sampleRate, channel, bytesPerSample, payloadType, isBigEndian);// 计算适当的帧大小 (20ms 的数据)frameSize = (sampleRate * channel * bytesPerSample * 20) / 1000;// 确保帧大小是样本大小的倍数int sampleSize = channel * bytesPerSample;frameSize = (frameSize / sampleSize) * sampleSize;Console.WriteLine($"Streaming parameters: SSRC={ssrc},SampleRate={sampleRate}, bitDepth={bitDepth}, Channels={channel}, PayloadType={payloadType}, isBigEndian={isBigEndian}, FrameSize={frameSize}");}public void StreamPcmFile(string filePath){using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)){byte[] buffer = new byte[frameSize];int bytesRead;while ((bytesRead = fileStream.Read(buffer, 0, frameSize)) > 0){SendRtp(buffer, bytesRead);// 等待适当的时间以保持正确的速率int samples = bytesRead / (channel * bytesPerSample);int delayMs = (samples * 1000) / sampleRate;Thread.Sleep(delayMs);}}}public byte[] CreateRtpPacket(byte[] buffer, int bytesRead){return packetizer.CreateRtpPacket(buffer, 0, bytesRead);}public byte[] DepacketizeRtpPacket(byte[] rtp){return packetizer.DepacketizeRtpPacket(rtp);}public void SendRtp(byte[] buffer, int bytesRead){// 创建RTP包byte[] rtpPacket = CreateRtpPacket(buffer, bytesRead);// 发送RTP包
            udpClient.Send(rtpPacket, rtpPacket.Length, remoteEndPoint);// 发送RTSP over UDP//byte[] rtspPacket = packetizer.CreateRtspPacket(rtpPacket);//udpClient.Send(rtspPacket, rtspPacket.Length, remoteEndPoint);
        }public void Close(){//udpClient?.Close();
        }}
}

 

功能

1. 播放本地音频文件

2. 音频播放:服务端推送音频文件并播放

3. 音频回调:RTP解包并进行音频播放

4. 开始对讲:测试流程:html将麦克风数据转base64,websocket发送中间件,转成音频编码:G.711alaw,进行rtp打包,udp发送到5004,vlc播放sdp文件测试

5. 结束对讲

6. 摄像头播放:VLC打开SDP文件,播放服务端音频,测试流程:读取pcm文件,进行rtp打包,udp发送到5504,vlc播放sdp文件测试

image

image

 

http://www.sczhlp.com/news/27950/

相关文章:

  • 网站建设分几种网上推广培训
  • 网站建设应该怎么做百度商家怎么入驻
  • 株洲做网站建设廊坊seo排名霸屏
  • 常州网站建设机构营销推广投放
  • 网站排名高权重低公司怎么做网络营销
  • 网站结构流程图怎么做常州百度推广代理公司
  • 手机wap网站源码购物链接
  • 个人主页网站设计代码病毒式营销
  • 专业网站建设软件开发seo赚钱吗
  • Go语言中的短变量声明 + 错误检查模式详解 - Charlie
  • 【IEEE出版】 第五届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2025)
  • MATLAB实现ACO-GA-PSO混合算法解决TSP经典问题
  • Oracle在线日志添加
  • 领导高度重视门户网站建设什么叫seo优化
  • 党建网站建设可行性分析seo千享科技
  • 邯郸美食林商业供应链管理系统搜索引擎优化不包括
  • 网站平台被骗了怎么办百度电话查询
  • 邮件系统未来趋势展望:AI、区块链与量子计算的融合
  • 保定网站建设哪家好自媒体怎么做
  • 网站建设推荐郑国华东莞营销型网站建设
  • 东莞市房管局官方网站怎么创建网站免费建立个人网站
  • 搭建网站需要多少钱绍兴seo公司
  • 学做甜品的网站网络推广外包
  • 网站产品关键词导出网络公司品牌推广
  • 服装公司电子商务网站建设策划书重庆seo快速优化
  • 企业网站管理系统视频教程自己的app如何接广告
  • 做国外的批发网站有哪些产品策划方案怎么做
  • 【数论】小刻都能看懂的乘法逆元
  • 【SPIE出版】第七届光电科学与材料国际学术会议 (ICOSM 2025)
  • MATLAB实现UKF(无迹卡尔曼滤波)