- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[基于RTP协议的打包及解包
H.264视频在android手机端的解码与播放
文/南京邮电大学 张永芹 龚建荣
摘 要:本文实现了手机终端通过移动无线网络与媒体服务器进行通信,并就开发过程中的几个技术难点的解决方法进行了说明。首先详细分析说明了rtp打包,解包的流程,这是视频传输的基础;然后在RTP传输过程中,针对发送数据快而处理速度慢的问题,采用多线程并发机制予以解决;面对大量,而且不稳定的数据包,本文针对各个环节自己的特点,设计了多级缓冲处理机制,使得视频播放更加流畅、平稳。接着,对于分析和解码的先后次序的问题,则采用线程协作的思想,利用消费者,生产者模式,保证了视频数据的时序性。最后对于视频解码部分,则利用现有解码方法进行平台移植,深度简化代码,合理处理c层和java层的分工。最后实践证明,采用本文提供的方法,视频传输、播放成功,而且android手机端视频播放延时短,流畅,平稳。
关键词:H.264 RTP 多级缓冲 线程协作 android
随着无线网络和智能手机的发展,智能手机与人们日常生活联系越来越紧密,娱乐、商务应用、金融应用、交通出行各种功能的软件大批涌现,使得人们的生活丰富多彩、快捷便利,也让它成为人们生活中不可取代的一部分。其中,多媒体由于其直观性和实时性,应用范围越来越广,视频的解码与播放也就成为研究的热点。
H.264标准技术日渐成熟,采用了统一的VLC符号编码,高精度、多模式的位移估计,基于4×4块的整数变换、分层的编码语法等。这些措施使得H.264算法具有很高的编码效率,在相同的重建图像质量下,能够比H.263节约50%左右的码率。而且H.264的码流结构网络适应性强,增加了差错恢复能力。正好适用于带宽受限,差错率高的无线网络。
本文结合ffmpeg开源代码中的解码方法,采用多线程接收数据包,多级缓冲数据,接收和解码并行双线程操作等方法,缓解了由于传输的数据量大、速度快而导致的数据堵塞、解码出错、视频画面迟钝、延迟等问题。使得h.264视频的传输速度快,稳定性好。最终实现了pc端到android手机端的视频传输,以及在android手机端的解码播放。
该技术可以应用于视频会议、视频监控等应用中。
一、 H.264视频传输播放系统的总体结构
H.264视频传输播放系统分为服务器端和客户端2个部分,服务器端负责读取H.264的视频数据,并且以RTP/RTCP格式打包发送给客户端,并且接受客户端的反馈,对传输速度等作相应的控制。Android手机客户端主要完成从服务器端接收实时码流数据,经过缓冲,进行视频数据解析,然后送去解码,最后在手机上显示播放。服务器端采用c语言实现,客户端主要用java语言实现。
二、关键技术及其实现
1.基于RTP协议的打包及解包
(1)单个NAL打包
H.264NALU单元常由[start code][NALU header][NALU payload]三部分组成,其中start code 用于标志一个NALU单元的开始,必须是或者是“000001”,打包时去掉开始码,把其他数据打包到RTP包就可以了。
(2)分片打包
由于1500个字节是IP数据报的长度的上限,去除20个字节的数据报首部,1480字节是用来存放UDP数据报的。所以当一帧中的字节数超过这个数值时,我们必须将其分片打包。而且UDP在传输的过程中也要由包头开销,所以将RTP包的最大字节数定位1400字节。
需要分片的包格式有所区别,首先说明下分片的格式:
FU指示字节有以下格式:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
FU指示字节的类型28,29表示FU-A和FU-B。NRI域的值必须根据要分片的NAL单元NRI的值设置。
FU头的格式如下:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E|R| Type |
+---------------+
S:开始位(1bit),当设置为1,开始位指示分片NAL单元的开始。第一个分片包设为1,其他的分片设置为0。
E:结束位(1bit),当设置为1,结束位指示分片NAL单元的结束,即,FU荷载是最后分片时设置为1,其他时候设置为0。
R:保留位(1bit),必须设置为0。
Type:5bit
(3)打包和解包的流程分析:
打包:
分片时详细说明:
①第一个FU-A包的FU indicator 是这么设置的:F=NALU头中的F,NRI=NALU头中的NRI,Type=28 FU header: S=1,E=0,R=0,Type=NALU头中的Type;
②中间的FU-A包的F
文档评论(0)