采用UDP传输音视频时的效果

 已经很久没有写博客了,心中颇有荒废的不安。想起最近一年一直在写音视频的东西,就趁热打铁将音视频传输的东西写出来吧。一来作为自己工作的积累,二来希望能为有这方面需求的朋友提供一点借鉴。

    很多年以来我一直觉得在音视频传输方面如果采用TCP协议会有较大延迟,尤其是在公网上延迟会比较大。所以我一直想写RUDP的东西来达到音视频传输的实时性,但是因为没有相应的项目让我去接触,所以这件事情就一直搁置了下来。直到做我的音频棋牌的时候,才实际接触了音视频传输。由于没有现成的RUDP传输基础类,就在网上找到了UDT来作为传输的基础进行开发。当时觉得UDT挺不错的,也能满足我的要求,就没有再深入地去研究了(后来才知道这东西是个坑),反正作为Demo是已经可以了的。

 

    当我有机会着手开发音视频直播软件的时候,我便顺其自然的建议采用UDT来进行开发。由于有以前的基础,所以在很短的时间内将音视频传输部分完成,并在内部测试通过。

    产品上线了,我信心满满的看着自己在短时间内做完的产品,心里不由得有些得意了。可是产品上线以后,就陆续有人反应无法看到视频,同时也无法听到音频。因为刚开始反映无法接收到音视频数据的用户是联通的,而我们的服务器放在电信机房,便以为仅是电信、联通线路互联互通的问题,所以也没引起多少的在意。后来逐渐发现有些电信用户也是无法接收到音视频数据的,这就让我很疑惑,难道UDT真的有问题么?逐渐地,越来越多的电信用户无法得到音视频数据的事实让我确定,应该是UDT出现了问题。本想着去看看UDT的代码从而解决问题,却发现UDT的代码太多,涉及很多参数,阅读起来简直太困难了。后来又想,要不找UDT的作者提问一下,看看是什么问题,却发现UDT早就不再进行维护,作者的人影都找不到了。这下麻烦了,看着整天用户抱怨无法正常看到视频、听到音频,我下了一个艰难的决定——写一个满足音视频使用的UDP通信类。

 

    现在想想都不知道自己为啥在时间那么紧的情况下做出这种不知天高地厚的决定。

说写就马上写起来,首先要整理一下自己的优势和劣势,哪些知识了解,哪些知识不了解。优势是我对IOCP非常了解,劣势是我不了解RUDP的原理。幸好我有朋友这么多年一直在开发这方面的东西,完全可以请教他。看来所需的知识都是具备的,或者说可以通过请教来具备的。那还等什么?说干就干!

 

    首先写出IOCP对于UDP传输的架构来。OK,这个很简单,花不了多久就完成了。然后将对象池、内存池等等添加进去,这个也很容易。剩下的再把帧数据管理、小包管理等等的类添加进去,这些都很容易完成,所以我先将自己能完成的东西都先完成。剩下三个问题的就是比较麻烦的东西了,一个是数据包的重发时间确定、一个是回包的方式、以及确定哪些小包是否已经接收到。这些没办法只能请教好友,好在对于他来说都是轻车熟路,虽然他只是给我了一些点拨,但是对我的帮助的确非常大。而且在请教的过程中我发现,好友最大的用处就在于当你对一些事情不清楚的时候你可以连续不断、不知羞耻的继续询问,而他也不会发脾气。这次我才知道原来我的脸皮挺厚的,哈哈。在他的帮助下,RUDP的通信部分很快写完了,并进行了压力测试。现在已经运行在了线上,运行状态稳定,现在很少出现用户无法连接上的情况了。并且从运行来看,实时性上比RTMP方式的实时性要高很多,下面的图就是实际产品中主播的实时视频截图。


wKiom1aM2kzg3g4AAACeyGE96ak572.png

本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/1732189如需转载请自行联系原作者


fxh7622

好的,我会尽力回答你的问题。关于通过UDP传输音视频,我了解一些相关的知识,下面是一些学习笔记: 1. gstreamer是一个流媒体框架,用于创建、处理和播放多媒体流。它支持多种音视频格式,可以通过插件扩展功能。 2. 通过gstreamer可以使用UDP协议传输音视频数据。UDP协议是一种无连接的协议,不保证数据传输的可靠性和顺序性,但是传输效率高。 3. 首先需要创建一个gstreamer的pipeline,包括音视频源、编码器、UDP发送端等组件。例如: ``` gst-launch-1.0 -v filesrc location=test.mp4 ! decodebin ! x264enc ! rtph264pay ! udpsink host=192.168.1.100 port=5000 ``` 这个pipeline的作用是从test.mp4文件读取音视频流,解码后使用x264编码器进行压缩,然后使用rtph264pay将数据打包成RTP数据包,最后通过udpsink发送到指定的IP地址和端口。 4. 接收端需要创建一个gstreamer的pipeline,包括UDP接收端、解包器、解码器等组件。例如: ``` gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! autovideosink ``` 这个pipeline的作用是从UDP端口5000接收音视频数据,使用rtpjitterbuffer解决网络抖动问题,使用rtph264depay将RTP数据包解包成原始的H.264数据流,然后使用avdec_h264解码器进行解码,最后使用autovideosink播放视频。 5. 在实际使用过程中,还需要考虑数据的带宽限制、网络延迟等问题,以保证音视频传输效果。 希望这些笔记能对你有帮助。如果你还有其他问题,可以继续问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值