免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4725 | 回复: 13

[其他] 网络广播程序语音数据发送和接收速率匹配的问题 [复制链接]

论坛徽章:
0
发表于 2013-03-05 10:17 |显示全部楼层
最近做一个网络广播程序,遇到了个语音数据发送和接收速率匹配的问题,想问问大家有什么好的解决方法没有。
需求:
做一个网络广播程序,也就是在发送端电脑上选择音乐文件,在播放端机器上播放出来。
   
整个过程我想应该是这个样子的:
发送端   读取音乐文件->网络发送
播放端   接收网络数据->存入接收缓冲区->播放
由于播放端机器是单片机,其接收缓冲区大小是有限制的,因此如果发送端发送速率过快,则接收缓冲区有可能充满,从而语音可能出现覆盖现象,如果发送端发送速率过慢,则接收缓冲区有可能处于亏空状态,从而语音可能出现停顿现象。
   
现在需要讨论的是确定一个方法,使发送和接收两端速率能够匹配,即接收缓冲区始终不会出现亏空和溢出状态。
   
希望有经验的朋友指导一下。

论坛徽章:
0
发表于 2013-03-05 11:21 |显示全部楼层
希望有经验的朋友指导一下。

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
发表于 2013-03-05 11:23 |显示全部楼层
最好的方法就是在发送端去做,类似于帧速的控制....
首先获取音频属性 计算出kbs数据,然后算出每秒最少发送的数据 在这个数据上增加一部分

再去实现一个定时器,定时去取出音频数据并完成发送任务

论坛徽章:
0
发表于 2013-03-05 12:27 |显示全部楼层
hanzhenlll 发表于 2013-03-05 11:23
最好的方法就是在发送端去做,类似于帧速的控制....
首先获取音频属性 计算出kbs数据,然后算出每秒最少发送 ...

首先,谢谢你的回复。只是这样好像还不是太可以。


已经验证过的方法
1.       根据要发送的音频文件的码率,算出发送的间隔时间,这个间隔时间可能是个小数,则取小的整数,也就是说发送端的速率稍微快一点。在验证过程中能可能出现覆盖现象

2.       根据要发送的音频文件的码率,算出发送的间隔时间,这个间隔时间可能是个小数,则一次发送使用小整数间隔,再一次发送时使用大整数间隔,这样可能会更加接进真实的发送间隔。在验证过程中出现了覆盖现象

3.       在发送端采集边播放边发送的方法,这样发送和接收两端的播放速率是一致的,但由于网络延时的存在,会出现停顿现象

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2013-03-05 12:29 |显示全部楼层
充满会覆盖, 这是指内核协议栈上的还是说应用层的?

论坛徽章:
0
发表于 2013-03-05 12:54 |显示全部楼层
linux_c_py_php 发表于 2013-03-05 12:29
充满会覆盖, 这是指内核协议栈上的还是说应用层的?


应用层的缓冲区

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2013-03-05 13:04 |显示全部楼层
chinesedragon 发表于 2013-03-05 12:54
应用层的缓冲区


那你可以控制的... 你不读就是了, 你不读, 对面也发布出来, 速率不就控制住了吗.

简单的说,

写端注册个写事件, 每次能写就从磁盘上读一块出来写, 能写多少就写多少, 剩下的留着下次写.

读端定时检测一下这首歌的速率控制的怎么样(和码率相关), 速率不高就注册读事件来读数据, 速率过高就取消读事件, 等着下次检测后恢复读事件.

论坛徽章:
0
发表于 2013-03-05 14:07 |显示全部楼层
linux_c_py_php 发表于 2013-03-05 13:04
那你可以控制的... 你不读就是了, 你不读, 对面也发布出来, 速率不就控制住了吗.

简单的说,


现在是在两台机器上,使用UDP协议发送和接收,如何能不读,对方就发不出来呢?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2013-03-05 14:53 |显示全部楼层
本帖最后由 linux_c_py_php 于 2013-03-05 14:54 编辑

udp协议你就需要多动手试试了- -...  设计因素太大了, 抛开udt这种完善的可靠UDP不谈.


就光说做你这个东西, 客户端点击放歌A, 你得告诉服务端你要A, 然后服务端收到后要给客户端应答A有多少包, 共多少字节, 客户端根据这些信息去直接请求数据即可, 不需要考虑太复杂的东西.

客户端问服务端要A-1开始的10个包, 然后服务端一下给你顺次发出A-1~A-10, 客户端收到什么就存到对应的索引上, 剩下就是超时+滑动窗口来重新请求丢失的数据, 至于速率, 你可以收下来, 先检查一下内存是否充足, 不充足就检查一下此包是否可以用来滑动窗口, 如果不能用于滑动窗口就直接丢了, 免得占用内存.

论坛徽章:
0
发表于 2013-03-05 15:20 |显示全部楼层
"e]linux_c_py_php 发表于 2013-03-05 14:53
udp协议你就需要多动手试试了- -...  设计因素太大了, 抛开udt这种完善的可靠UDP不谈.


[/quote]"

也许我没有表述清楚。
我这个是服务器端主动向各个播放端发送要播放的文件数据,播放端只能被动接收,而且应该是完全接收,并且需要一边接收一边播放。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP