免费注册 查看新帖 |

Chinaunix

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

[算法] 求给对方播放影音文件功能的实现方法 [复制链接]

论坛徽章:
0
发表于 2013-01-12 16:47 |显示全部楼层
求给对方播放影音文件功能的实现方法

最近要实现一个给对方播放影音文件功能的软件,影音文件格式目前以WAV做例子,以后会扩展到MP3、WMA等多种文件类型,平台是Windows平台,使用的的方法是waveInXXX和waveOutXXX等API函数。
现在的实现方法是这样的,在本方读取一个WAV文件,将WAV数据通过UDP发送给对方,对方接收到数据后放入缓冲区,然后调用waveOutWrite函数将声音播放出来。
现在的问题是由于在接收方开辟的缓冲区数量是一定的,如果本方WAV数据发送比对方播放得快则会接收方缓冲区用完而导致丢数据,如果本文WAV数据发送比对方播放得慢则会出现声音不连续情况,如何能够让双方比较配合地完成这一功能呢?
本方发送WAV数据对方回复这种交互方式不可用,因为本文可能会同时给多个接收方发送WAV数据。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2013-01-12 20:34 |显示全部楼层
本帖最后由 cokeboL 于 2013-01-12 20:35 编辑

回复 1# chinesedragon


播放前预算传送速度和预传,比如对方点歌,一般都要缓冲10秒左右或几秒至少,这段时间,可以做的事情:

1.有花3、4秒测试点对点最大传送速度(点对多也是多任务每个点对点),然后计算出比较合理的速度s,s满足:
   播放连续要求的最低速度 <= s <= 最大传送速度

2.以测得的速度预传一段过去

丢包、重传那些在客户端发命令

俺瞎说的,不知道有用没

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2013-01-12 20:42 |显示全部楼层
预传的可以让对方保存临时文件再解析,预传的大小也可以根据播放需要的

速度计算出一个合理值,然后预传多少后就可以播放了

酷我那些听歌的时候好像都要缓冲呢

论坛徽章:
315
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2013-01-12 21:37 |显示全部楼层
为何不用现成的流媒体协议?

论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2013-01-12 21:51 |显示全部楼层
回复 4# hellioncu


    rtp/rtsp也要有实现吧?推荐一个开源的?

论坛徽章:
315
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2013-01-12 22:01 |显示全部楼层
starwing83 发表于 2013-01-12 21:51
回复 4# hellioncu


我不做这行,也没研究过,只是觉得这种不应该自己来创造轮子。
搜索 开源流媒体服务器 还是能找到一些的。

论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2013-01-12 22:10 |显示全部楼层
回复 6# hellioncu


    代码都很专,没什么复用性。

这个东西安卓自己的源代码里面都很缺,我和@mci2004有段时间一起研究过,他比较有 发言权。

关键是,这个东西和你自己的需求联系太紧密了,无论什么实现你都得修改一点地方,或者写一点适配代码(和webkit那种很像),所以开发量还是会很大。

当然完全不反对研究流媒体协议,以及采用现有的代码(如果有的话……反正我没找到好的),这个就算对自己设计协议也是有指导作用的。

论坛徽章:
3
摩羯座
日期:2013-11-12 20:06:19午马
日期:2013-11-27 16:35:55双鱼座
日期:2014-04-04 19:02:30
发表于 2013-01-12 22:51 |显示全部楼层
回复 7# starwing83


    你太看的起我了,现在的问题是光有 rtsp是不够的,rtsp协议只负责传啊。

    问题是要让对端知道什么时候开始传,传什么...   想想看我们用手机打视频电话的时候(擦,直接用VOIP比较容易描述),在VOIP的时候不就是要跟对端传音频和视频吗?参考下 VOIP用到了那些协议。

    LZ,现在肯定是想做个现成的简单的出来,肯定是不想被各种协议烦。那么让我想想....... 唉,越想越复杂越来越多的东西要考虑。lz,知道ffmpeg吗? 算了,感觉说起来就很麻烦,LZ肯定是没兴趣听的。

论坛徽章:
0
发表于 2013-01-13 20:15 |显示全部楼层
@cokeboL @hellioncu  @starwing83 @mci2004
首先感谢各位的回复!
现在的流媒体协议确实是太复杂了,况且我们还有一些自己的功能,比如控制供电、控制音量等。因为我们所有人都是刚接触这个业务,所以确实不能太复杂了。
所以我觉得还是预传比较适合我们,因为我们这个并不是两个PC端的应用,而是PC对单片机,正如我在一楼描述的,由于缓冲区是一定的,预传一定数据后,再以一个合适的速度传输,现在的问题就是这个合理的速度应该怎样去确实,而不会使单片机一端的缓冲区满了或者空了。

论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2013-01-13 20:37 |显示全部楼层
回复 9# chinesedragon


    你怕不怕浪费带宽?

不怕的话,每次发送都要一个ACK,然后没有ACK的段会被安排重发(ACK之前的段就不会被重发了——都ACK了,证明前面的要么缓存了要么播完了,就无所谓了)。

客户端有一个缓冲区,缓冲的包在这里发送ACK,满了直接丢包,服务器会不停地给你发的。

同样的原理可以用在客户端,反过来即可,稍微节省带宽一点。

(其实你就直接用TCP就行了魂淡……)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP