玻璃行业做的非常有设计感的网站,wordpress+空行,手机端wordpress模板下载,天津软件开发培训机构视频网络传输一定要用rtp吗#xff1f;
RTP/RTCP有一套很好的反馈机制#xff0c;通过其可以估算网络状况#xff0c;然后在编码端进行调整#xff0c;如网络繁忙时适当的降低画面质量#xff0c;减小码率等#xff0c;主要是想通过RTP/RTCP协议实现QoS#xff01;同时…视频网络传输一定要用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库都做得很好。我觉得用库的最大优点就在这吧”。 三、和代码相关的原理性的东西大家应该去看看RFC3550RFC3984.这两份协议都有热心网友翻译好的中文版。我把他们放在压缩包里大家就不用再累个半死去搜索注册下载了。如果为了更省事我觉得看看这位网友总结的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是接受不到数据的。在cIN IP4 192.168.0.30 和mvideo 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_increse0;timestamp_increse(unsigned int)(90000.0 / framerate); 即初始值设为0时间戳增量设为90000.0 / framerateframerate我设为25即每秒25帧。每发送一个NALU单元时间戳增加。若是该NALU大于1400字节需要分片时则多个分片拥有相同的时间戳。这样设置是否正确。请牛人给个权威解答。2.按照我的理解SDP文件仅实现了告诉VLC在哪个IP和端口接受264RTP包同样的信息我也通过在VLC的媒体-》打开网络串流协议选RTP然后填写IP和端口号中设置好了为什么用打开SDP文件的方法能接收但用后者VLC却没有一点反应。3.当我将帧率设为25时即代码里的float framerate25vlc能接受码流但会比较卡常缓冲提示错误为main error: ES_OUT_SET_(GROUP_)PCR is called too late, increasing pts_delay to 339 ms。我怀疑是我的电脑发送UDP包速度不够每秒播放25帧的所需要的UDP包数量因此在SDP文件我添加了aframerate:15来限制播放器每秒播放15帧同时在代码里的相应行float framerate15;也将帧率改为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 属于一帧。