按照RFC3984协议实现H264视频流媒体(附源代码)

yanyuan9527 2010-01-04 04:22:43
相信有不少人和我一样,希望实现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,这里提供了很多有用的信息。
...全文
26316 291 打赏 收藏 转发到动态 举报
写回复
用AI写文章
291 条回复
切换为时间正序
请发表友善的回复…
发表回复
wu098712 2012-10-20
  • 打赏
  • 举报
回复
楼主,真的太太太感谢你了!
yyd01245 2012-10-14
  • 打赏
  • 举报
回复
都在赞美楼主啊!对于我们初学的真的很好!谢谢楼主分享!
酱油几时有 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 280 楼 的回复:]
能否问个问题,打包的时候,

memcpy(nalu_payload,n->buf+1,n->len-1);//去掉nalu头的nalu剩余内容写入sendbuf[13]开始的字符串。

这里n->len为什么要减1呢?
[/Quote]

原来这一部分的第一个字节和上一部分的最后一个字节是相同的,所以去掉第一个字节复制过来。
  • 打赏
  • 举报
回复
知识需要分享
楼主好人
folk110 2012-08-17
  • 打赏
  • 举报
回复
谢谢楼主贡献
yyd01245 2012-08-15
  • 打赏
  • 举报
回复
楼主真的是好人啊!
maxrooming 2012-08-05
  • 打赏
  • 举报
回复
楼主好人,正在做这个东西,下下来先学习下~!
jimmyzhke 2012-08-03
  • 打赏
  • 举报
回复
楼主真是好人啊。狂顶一下了。
朱韦刚 2012-07-30
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/u/2780630180,这是我的博客,将了些流媒体的东西,对新手希望能有点帮助。。
朱韦刚 2012-07-30
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/zhuweigangzwg/4285843,这是我前段时间编的,编的时候纠结了点,后来发现没什么难的。
酱油几时有 2012-07-26
  • 打赏
  • 举报
回复
能否问个问题,打包的时候,

memcpy(nalu_payload,n->buf+1,n->len-1);//去掉nalu头的nalu剩余内容写入sendbuf[13]开始的字符串。

这里n->len为什么要减1呢?
酱油几时有 2012-07-26
  • 打赏
  • 举报
回复
能否问个问题,打包的时候,

memcpy(nalu_payload,n->buf+1,n->len-1);//去掉nalu头的nalu剩余内容写入sendbuf[13]开始的字符串。

这里n->len为什么要减1呢?
zsyh2008 2012-07-20
  • 打赏
  • 举报
回复
非常感谢!!很有用!!!
seeQe 2012-07-19
  • 打赏
  • 举报
回复
刚开始学习,没有深入理解,下次再来
lijinkai 2012-07-10
  • 打赏
  • 举报
回复
顶楼主,这是一个非常有价值的贴子。
powerful100 2012-06-20
  • 打赏
  • 举报
回复
顶起,楼主好人呀! 美中不足的是要积分,苦B的我就缺这个.
gangstermxf 2012-06-07
  • 打赏
  • 举报
回复
好评如潮啊。谢谢了!
江南烟雨梦 2012-06-07
  • 打赏
  • 举报
回复
好贴!
一叶知秋dong 2012-05-31
  • 打赏
  • 举报
回复 1
中国软件就需要楼主这种精神,何必让千千万万的人去走弯路。
addgodd 2012-05-30
  • 打赏
  • 举报
回复
感谢楼主奉献精神
加载更多回复(239)

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧