按照RFC3984协议实现H264视频流媒体 RTSP H264

转自:http://topic.csdn.net/u/20100104/16/0fd992e8-b0a6-4c2b-85a4-d9513d3b1491.html

 

相信有不少人和我一样,希望实现H264格式视频的流媒体播放。但是对于一个新手来说,往往不知道从何入手。利用百度,GOOGLE等搜索资料真是沙里淘金。在琢磨了N周之后,才弄出来了点成果,其中费了很多无用的功夫,光看英文协议就费了一周,后来才知道有中文版,并且我所达到的目的很简单,只要让VLC实时播放就行,不需要了解整个协议。我也很希望能直接搜出来一套代码,都一直没找到,还是得自己动手。现在我把自己的代码贴出来,希望对做类似工程的朋友有所帮助。
一、本示例代码在我的电脑上实现了对标准H264码流的RTP打包发送到本机的1234端口,用VLC播放器从1234端口能接收到该码流并实时播放。代码附有详细的注释,应该很容易理解(前提是大家稍微对RFC3550 RFC3984协议有了解)。
二、本示例代码是按照RFC3984协议仅完成了RTP打包,并没有完成发送RTCP。原因就引用这位达人的话:“1.RTCP里头有很多关于RTCP发送简隔的时间计算,RTP信息的统计,这种操作不是难,而是烦,我不想去写。2.RTCP和RTP一开始出来的时候并不是因为视频的点播等应用的,而是视频会议。RTCP有管理与会者的层面含义,这一功能在很多场合并不会用到。3.我想简单,没有写多个流间的同步,如一个影片的视频和音频流。这些其实是RTCP来完成的。我懒得去写,因为这些工作RTP的各个库类(例如JRTPLIB库)都做得很好。我觉得用库的最大优点就在这吧”。
三、和代码相关的原理性的东西,大家应该去看看RFC3550,RFC3984.这两份协议都有热心网友翻译好的中文版。我把他们放在压缩包里,大家就不用再累个半死去搜索注册下载了。如果为了更省事,我觉得看看这位网友总结的RFC3984的内容就够了。网址是http://www.cppblog.com/czanyou/archive/2009/12/25/67940.html。如果打不开网页,就到压缩包里资料文件夹下找吧。我已经把网页保存下来了。
四、代码并非是我完全原创的,而是我在搜索到得网友的代码的基础上修改的。这里要特别感谢以下几位网友:1.猫头上的鹰(他的博客地址http://blog.csdn.net/Tinnal/archive/2008/09/03/2871734.aspx)在他的博客里我第一次找到了有价值的东西,并且他无偿提供的MPEG的RTP打包源码只要拷贝下来建个工程就能实现MPEG的流媒体,对我启发很大。2.liming,他提供的代码已经实现了H264的码流分析,将其中的每个NALU单元分离开来,并分析出了NALU的类型,长度等信息。为我实现RTP打包提供了很大的方便,事实上,这份示例代码就是在他的代码上添加了RTP打包部分,我连工程名字都没有改。他的源代码在这里http://www.pudn.com/detail.asp?id=510807。3****,他提供的SDP文件在关键时候帮了我大忙,我发送的RTP数据包通过Wireshark抓包工具分析一直没错,可VLC播放器就是没任何反应。直到下载了他的SDP文件文件后终于出画面了。某位网友说VLC对H264只能通过TS封包或SDP文件打开RTP码流,在此我也这么怀疑。4.jessiepan和他的帖子,http://topic.csdn.net/u/20090725/11/5FBC75B0-1091-4DD4-9154-3E3D59F9B6D1.html,这里提供了很多有用的信息。

 

使用方法:直接在VC6上打开工程,编译。(需要注意的是大家要把IP地址和端口改为自己的。在h264.h的#define DEST_IP "192.168.0.30"和#define DEST_PORT 1234这两行修改就行了。同时w.sdp文件里也要改成一致的IP和端口号,不然VLC是接受不到数据的。在c=IN IP4 192.168.0.30 和m=video 1234 RTP/AVP 96这两行。中间的1234是我设置的端口号。)在执行程序之前,先用VLC打开w.sdp文件,然后执行程序,就可以看到画面了:)。同样需要注意的是VLC1.0以后的版本不支持直接打开h.264视频文件,但是0.97版本就支持。两个版本的VLC播放器大家去着哩下载这里我测试用1.03和0.97两份版本的VLC都可以接受并播放h.264RTP码流。
目前还有几个问题我没有弄明白,希望有高手在看完这个帖子后能帮我解答:
1.关于时间戳的设置。RFC3984里没有提到时间戳具体如何计算,我也是按照各方面的小道消息这样设置。unsigned int timestamp_increse=0;timestamp_increse=(unsigned int)(90000.0 / framerate); 即初始值设为0,时间戳增量设为90000.0 / framerate,framerate我设为25,即每秒25帧。每发送一个NALU单元,时间戳增加。若是该NALU大于1400字节,需要分片时,则多个分片拥有相同的时间戳。这样设置是否正确。请牛人给个权威解答。
2.按照我的理解,SDP文件仅实现了告诉VLC在哪个IP和端口接受264RTP包,同样的信息我也通过在VLC的媒体-》打开网络串流,协议选RTP,然后填写IP和端口号中设置好了,为什么用打开SDP文件的方法能接收,但用后者VLC却没有一点反应。
3.当我将帧率设为25时(即代码里的float framerate=25;)vlc能接受码流,但会比较卡,常缓冲,提示错误为main error: ES_OUT_SET_(GROUP_)PCR is called too late, increasing pts_delay to 339 ms。我怀疑是我的电脑发送UDP包速度不够每秒播放25帧的所需要的UDP包数量,因此在SDP文件我添加了a=framerate:15来限制播放器每秒播放15帧,同时在代码里的相应行float framerate=15;也将帧率改为15这样虽然解决了卡的问题,但是视频播放很慢。请问要是我想达到每秒播放25帧,难道只能换台好电脑了?
5.下一步我想用jrtplib来打包RTP,因为听说用这个库实现RTCP很方便,是不是这个库会根据网络状况自动发送RTCP信息。如果哪位高手有这方面的代码或者是实现了RTSP的代码,希望能拿出来交流,哪怕是部分代码或者是实现部分功能也好。
  源码下载地址:http://download.csdn.net/source/1961862大家下载后有什么问题可以直接和我联系,不留邮箱了,直接留QQ号吧:1002666420.另外我这里还有一个老外写的用LIVE555库实现H264 STREAMING的教程及代码,有需要的可以联系我。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建SSM框架之Spring

作为一枚大四准备毕业的学生,最重要的事便是毕业设计,前些日子刚刚拿到毕设题目:“3D网络图:面向网络结构数据的可视化软件设计”,(⊙o⊙)…,怎么说哪,看到题目就是一头雾水(前几届不…

audio unity 加速_浅谈Unity中Android、iOS音频延迟

在Unity上面做音游,当在移动端实机运行起来,会发现,音频的发出会有一定的延迟,无论是长音效还是短音效,Unity内置的Audio内部使用的是FMOD,有以下手段改善通过设置稍微改善其延迟的问题Edit → Project Set…

深度学习之 hard negative mining (难例挖掘)

Hard Negative Mining Method 思想 hard是困难样本,negative是负样本,hard negative就是说在对负样本分类时候,loss比较大(label与prediction相差较大)的那些样本,也可以说是容易将负样本看成正样本的那些…

单列表_使用Excel中的quot;记录单quot;功能快速录入数据

在Excel中进行数据录入的时候,平常都是一行一行地录入数据,但是有时候在单元格之间,行与行,列与列之间频繁地切换去录入数据,费事费力还容易出错。今天给你推荐一个既好用又有效率的Excel中的隐藏功能——“记录单”。…

CentOS 6.9下的Setup工具(用于管理服务/防火墙/网络配置/验证服务)

说明:Setup工具套件好像是CentOS下特有的用于管理服务/防火墙/网络配置等,其实就是基于命令行模式界面的GUI工具。唯一特点就是方便。 安装: #安装Setup命令工具 yum -y install setuptool #安装Setup工具配套的系统服务组件 yum -y insta…

wireshark解析rtp协议,流媒体中的AMR/H263/H264包的方法

原文教程:http://hi.baidu.com/zjxiaoyu3/blog/item/22f9f18f32b45de5f11f3670.html 抓到完整的流媒体包之后,用wireshark打开,其中的包可能不会自动映射成RTP+AMR/H263/H264的包,做如下修改操作…

深度学习之非极大值抑制(Non-maximum suppression,NMS)

非极大值抑制(Non-maximum suppression,NMS)是一种去除非极大值的算法,常用于计算机视觉中的边缘检测、物体识别等。 算法流程 给出一张图片和上面许多物体检测的候选框(即每个框可能都代表某种物体)&…

148. 颜色分类

给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。 我们可以使用整数 0,1 和 2 分别代表红,白,蓝。 注意事项 不能使用代码库中…

vue项目token放在哪里_关于vue动态菜单的那点事

vue-element-admin4.0国内节点访问地址:https://panjiachen.gitee.io/vue-element-admin-site/zh/本此使用的是https://github.com/PanJiaChen/vue-element-admin/tree/i18n 国际化分支的版本。说是除了国际化其他都一样。本文主要介绍前台动态的使用资源权限。后台…

H264学习方法历程资料

我的H.264学习历程 半年前,我知道了H.264这个名词。那个时候决定学习H.264,可是我连资料都不知道如何收集。而且整个学校就只有我一个人在学习H.264, 找不到人交流,所以那个时候学得真的是举步维艰,很痛苦&#xff0c…

深度学习之 ROI Pooling

什么是ROI? ROI是 Region of interest 的简写,指的是 Faster R-CNN 结构中,经过 RPN 层后,产生的 proposal 对应的 box 框。 ROI Pooling 顾名思义,是 pooling 层的一种,而且是针对 ROIs 的 pooling。整个…

KD树小结

很久之前我就想过怎么快速在二维平面上查找一个区域的信息,思考许久无果,只能想到几种优秀一点的暴力。 KD树就是干上面那件事的。 别的不多说,赶紧把自己的理解写下来,免得凉了。 KD树的组成 以维护k维空间(x,y,……)内的KD树为例…

多元函数求极值中的a_多元函数的条件极值和拉格朗日乘数法

、条件极值、拉格朗日乘数法1. 转化为无条件极值在讨论多元函数极值问题时,如果遇到除了在定义域中寻求驻点(可能的极值点)外,对自变量再无别的限制条件,我们称这类问题为函数的无条件极值。如求的极值,就是无条件极值问题。然而在…

深度学习之 RPN(RegionProposal Network)- 区域候选网络

anchor boxes基本概念与作用: feature map 上的一个点可以映射回输入图片上的一个点,以特征图上这个点为中心,预先人为设定 k 个 boxes,这些 boxes 就称为在这个点上生成的 k 个 anchor boxes(所有anchor boxes的中心点坐标是一样…

h264的码率控制 JVT-G012

开始看h264的码率控制,很多地方都提到 G012,拿来做为参考比较,看来很有必要研究清楚。 偶这人,E文文档不翻译的话,看过就忘了,于是草草翻译了下,因为不打算做B帧,也不准备在同一帧中…

Android RecyclerView嵌套EditView实时更新Item数据

一、场景(例如:购物车) 1、当我们需要以列表样式管理某些数据时,可能需要列表项的某个字段可编辑 2、编辑Item上的某个字段后可能还要更新相关字段的值 二、可能遇到的问题 1、列表滑动导致输入框中的数据错位(或者焦点…

workbench拓扑优化教程_优化技术在水泵水力设计的应用(上篇)

文章来源:安世亚太官方订阅号(搜索:Peraglobal)CFD技术在泵的内流数值模拟、研究泵内部流动规律和结构方面已广泛应用,取得了很多成果。但是初步设计的产品如果通过CFD仿真得到的性能曲线不能满足使用要求,…

深度学习之 TensorRT

1 简介 TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应用提供低延迟、高吞吐率的部署推理。TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。TensorRT现已能支持TensorFlow、Caffe、Mxne…

H.264笔记

H.264标准写得比较繁复,所以考虑在浏览完Whitepaper之后就开始研读X264代码。X264代码风格还是比较清晰简洁的。根据对标准得理解,Picture Order Count在Slice解码的一开始就被提及:I0 B1 B2 P3 B4 B5 P6I0 P3 B1 B2 P6 B4 B5于是I0的POC是0&…

进制转换中dbho是什么意思_什么是网段?二进制十进制如何互相转换?看完这篇,你就全明白了...

之前的文章讲了ip,子网掩码,网关的关系,今天着重讲一下网段。我们用傻瓜交换机通讯时,一个网段的设备才能互相通讯,怎么能判断两个ip是同一个网段呢?今天就简单的说一下。(这篇文章用语音听可以起到催眠作用…