rtp问题引领汇总

视频网络传输一定要用rtp吗?

RTP/RTCP有一套很好的反馈机制,通过其可以估算网络状况,然后在编码端进行调整,如网络繁忙时适当的降低画面质量,减小码率等,主要是想通过RTP/RTCP协议实现QoS!同时也可以用http或udp啊,都可以的,自己再加一些控制信息。利用rtp/rtcp的好处是这个协议本身帮你加入了 一些控制信息

相信有不少人和我一样,希望实现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打包部分,我连工程名字都没有改。他的源代码在这里
3.luny,他提供的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版本就支持。这里我测试用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的代码,希望能拿出来交流,哪怕是部分代码或者是实现部分功能也好。

1、第一个问题,如果你看过 RFC3984 就应该知道答案;
2、第三个问题,我认为不是发包速度的问题,发包其实是非常快的;
3、第四个问题,可以参考 Darwin 的源代码(下载地址:http://dss.macosforge.org/),不过这套代码非常庞大。VLC 的服务端源代码也应该会发 RTCP 吧?

A:RFC里说时间戳是RTP数据包里第一个字节的采样时间,就是说我在给一个NALU数据打上报头的时候调用系统函数time()来获取当前的系统时间(从1970年1月一日到现在所经过的秒数),这个秒数就是应该打在RTP包头上的时间戳吗? 还有RFC3984里提到必须使用90K的时钟,这个90K的时钟是干什么用的了?麻烦解答一下

我认为其实时间戳从 0 开始也可以。90K 是一个参考时钟,例如你的系统是 30fps,那么帧与帧之间的时间戳增量就该是 90000 / 30 = 3000。

A:谢谢版主,那我在第一个问题中叙述的时间戳设置方法看来是蒙对了啊。
不过关于第三个问题,当我把帧率设为25fps时,VLC经常缓冲,然后就会有马赛克了。版主知道这可能是什么原因吗?   经过我测试,只要帧率设为18fps以下,就没有这个问题。

这个得做实验具体分析了。有误码,说明码流出错了。先截取一下 VLC 收到的码流,看是否是正确的。

A:我用LZ的程序进行传输并播放,LZ程序中自带的两个.264文件都能正常播放,但是我用JM编码生成的.264文件就不能播放,这是为什么呢?请高手解答~~~

因为 JM 编码生成的 RTP 格式的 264 码流不是标准 RTP 格式。

A:我想请教您一个问题   如果不打成RTP包 直接打成TCP包可以么 我这个问题问的很无知 但是还是请您回答我下

如果打成TCP包,那就只有你自己的播放器能播了,因为通用的播放器,或者说是标准的播放器,都是播放RTP打包的数据。

A:如何判断nalu是否属于同一帧图像呢,难道根据unit_type吗?貌似这样也不对啊,nalu里有没有什么信息可以用来判断的吗,等待牛人指导。

编码器自己本来就知道哪些 NALU 属于一帧。

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

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

相关文章

Django的信号机制详解

Django的信号机制详解 Django提供一种信号机制。其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) 。当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行。 Django内置了一些信号,比如: django.…

垃圾回收算法_垃圾回收算法有哪些

垃圾检测通常通过建立一个根对象的集合以及建立一个从这些根对象开始能够触及的对象集合来实现。如果正在执行的程序可以访问到根对象和某个对象之间存在引用路径,这个对象就是可触及的。对于程序来说,根对象总是可以访问的。从这些根对象开始&#xff0…

不错的电子书下载网站

为什么80%的码农都做不了架构师?>>> www.jb51.net 电子书质量不错,虽然是扫描版的,但是都是高清的. vdisk.weibo.com 网盘, 内容很多! 转载于:https://my.oschina.net/GMT/blog/1188971

GeoHash核心原理解析

原文地址:http://www.cnblogs.com/LBSer/p/3310455.html geohash for php:附件下载geohash.tar.gz 引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西。某一天机机到北海公园游玩,肚肚饿了&am…

[转载]流行视频格式讲解

*. MPEG/.MPG/.DAT MPEG也是Motion Picture Experts Group 的缩写。这类格式包括了 MPEG-1, MPEG-2 和 MPEG-4在内的多种视频格式。MPEG-1相信是大家接触得最多的了,因为目前其正在被广泛地应用在 VCD 的制作和一些视频片段下载的网络应用上面,大部分的…

Ajax相关介绍

ajax是什么? AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。 AJAX 指异步 JavaScript 及 XML(Asynchronous JavaScript And XML)。 AJAX 是一种在 2005 年由 Google 推广开来的编程模式。 AJAX 不是一种新的…

解决Ubuntu中文件管理器死掉的情况

有时会遇到Ubuntu文件管理器死掉的情况,怎么点击都没有反应,这时只需在终端上运行 ps -A | grep nautilus, 查找文件管理器nautilus对应的pid,然后sudokillpid就可以关闭文件管理器进程,随便点击一个文件夹就可以重启文件管理器了…

element table 怎么知道点击的是第几行_el-data-table, 让CRUD更简单??

基于Vue2.x, element-ui 2.x,以及开源组件el-form-renderer封装了一个业务组件el-data-table,已在github开源,其目标是:makes restful api crud easily 特点:1. 使用axios自动发送请求2.自带新增/修改/删除逻辑(默认新…

Win10无法使用小娜搜索本地应用问题的解决方案

小娜介绍 win10的Cortana小娜是一个功能非常强大的语音和搜索助手,用户可以通过小娜助手搜索任意的文件和应用软件,不过有用户发现win10的小娜搜索不到已安装的本地软件,那么win10小娜助手无法搜索本地应用怎么解决呢?下面小编教大…

样本量

sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 根据power,effect size,a,决定样本量 # -*- cod…

【Python】 dict 以key名 去重运算

将日期相同的数据统计在一起 a_count [ {create_time: 2020-03-05, total_len: 1, count_invite: 1}, {create_time: 2020-03-11, total_len: 2, count_invite: 2}, {create_time: 2020-03-18, total_len: 2, count_invite: 2}, {create_time: 2020-03-06, total_len: 1, …

Vue相关知识总结

Vue简介 Vue是js的一个库,类似于JQuery Vue当前版本已经发展到2.X版本,并且现在市面上基本使用的都是2.X版本. 现在一些知名的互联网公司,例如滴滴,美团等,都在大量的使用vue 本段内容主要讲解Vue的基本知识和指令,了解vue的基本概念 注意: Vue 不支持 IE8 及以下版本 vue中…

宏块帧内预测的具体过程

对一个宏块进行帧内预测的具体过程如下: (1)对于8x8色度块就选择一种帧内色度预测模式建立相应的帧内预测块; (2)按遍历的方法分别计算4种Intra_16x16帧内预测模式的代价(Rdcost16x16&#xf…

qt获得 cpu 主频信息_高主频有什么用?我们玩了几款3A大作找到答案

[PConline 杂谈]对于热爱游戏的人来说,能在极致特效下流畅运行喜欢的游戏是一件幸事,因此作为影响游戏运算的CPU重要性不容小视。CPU如何判定?众所周知,核心数和主频算是判定一个CPU好坏的主要依据,但大多数CPU产品在高…

解决:关于Git无法提交 index.lock File exists的问题

问题 今天提交代码时,在一次提交,莫名其妙没成功后,再次用git commit -a命令时,出现以下错误,无论是用git还是TortoiseGit等其他客户端都会出现以下这个问题。。 错误日志 $ git commit -a fatal: Unable to create …

span居中

在父元素中加style"text-align:center"; 比如下面这样 <head></head><body><div style"width:300px;border:1px red solid;text-align:center;"><span style"width:100px;">测试</span></div></bo…

打造自己的 APP「冰与火百科」(一):分析定位

回想自己最开始学习 Android 的动力&#xff0c;其实很简单&#xff0c;就是想在手机上看到自己设计的 APP。但是在工作后&#xff0c;一直做的都是「别人」的 APP&#xff0c;偶尔还要做一些自己不太认可的设计和交互&#xff0c;从中获取到的成就感还不及第一次在手机上看到「…

python爬取有道翻译

python爬虫爬取有道翻译教程 编写环境 为了宝宝们能够正确读懂本教程,在正式开始前,宝宝们需要搭建的环境如下: 连接互联网的win10电脑,(win7也可以)Google浏览器(版本无要求)Python(版本3就可以了),如果没有安装的小伙伴可以参考python安装以及版本检测requests库(版本没啥…

PartitionMotionSearch()

Outline: 1、 CFG文件中有关多参考帧的相关选项 2、 多参考帧涉及到的数据结构和全局变量 3、 保存重建图像为参考帧 4、 编码一帧前&#xff0c;设置参考帧列表 5、 多参考帧的使用&#xff08;即参考帧的选择策略问题&#xff09; 6、 遗留问题 1、CFG文件中有关多参考…

bat 发送post请求_get post 请求

HTTP是一个基于TCP/IP来传递数据的通信协议。1.GET和POST请求的区别&#xff1f;a: GET/POST本质上都是TCP链接&#xff0c;GET传body和POST拼参数&#xff0c;理论上都是可行的。b: 实际上HTTP协议对URL长度是没有限制的&#xff1b;限制URL长度大多数是浏览器或者服务器的配置…