压缩包可以从这里获得:http://www.bairuitech.com/upimg/soft/jrtplib-3.7.1.rar
 
下载jrtplib-3.7.1.rar后,首先将其解压到一个临时文件夹中,然后开始后续工作。
首先需要强调的是,jrtplib是一个库而不是应用程序,编译后我们获得的是.lib文件。这个文件是用来实现RTP协议的,意义和我们在写WIN32程序时用到的kernel.lib一样。
解压后的文件夹中包含两个目录,jrtplib-3.7.1和jthread-1.2.1,打开这两个目录后我们可以看到下面又有两个同名的目录,为了后面能顺利编译,我们把同名目录下的文件全部考到上一级目录中,就是说把f:\jrtplib-3.7.1\jrtplib-3.7.1\*.* 复制到f:\jrtplib-3.7.1\。同理,把f:\jthread-1.2.1\jthread-1.2.1\*.* 复制到f:\jthread-1.2.1\
完成上述步骤后我们就可以开始编译库文件了。
Windows平台下建议使用Visual C++6.0。
首先编译多线程库jthread,在vc6中直接打开工作区文件jthread.dsw,改变工程设置,选中source file下的文件,点右键选择setting,确保code generation下Use run-time library 为debug mulitithreaded DLL或debug mulitithreaded。

然后选build就可以了,和上面一样的方法完成jrtpthread的编译。这个底下的文件比jthread多一些。

默认产生的文件是jthread.lib和jrtplib.Lib,这两个文件分别位于两个文件夹下的debug文件夹下,将它们复制到VC6的lib文件夹下。
完成上述工作后我们就可以开始尝试编译jrtplib附带的examples。
创建一个新的Win32 Console 应用程序项目,添加example文件到source files文件夹中,然后添加jrtplib工程下的所有.h头文件,这里我们可以用VC6提供的一个功能偷懒:)将jrtplib项目添加到本工作区,然后将Header Files下的所有文件复制到我们创建的工程的Header Files文件夹里面。
修改example.cpp文件,在文件开始添加
#pragma comment(lib, "jrtplib.lib")
#pragma comment(lib, "jthread.lib")
#pragma comment(lib, "WS2_32.lib")
或者在VC中a) Project->Settings->Link中Object/library modules:添加jthread.lib jrtplib.lib,
b) Link中添加ws2_32.lib
检查code generationdebug mulitithreaded DLL或debug mulitithreaded,方法同上文中检查库文件的方法。
最后就可以编译、连接、生成可执行文件了。
3、具体流程图
一.    调试记录
(1). 输入端口,IP后出错
ERROR: Can't retrieve login name
这是rtpsession.cpp中的createCNAME函数有问题
if (!gotlogin)
  {
  //     char *logname = getenv("LOGNAME");
         if (logname == 0)
                return ERR_RTP_SESSION_CANTGETLOGINNAME;
         strncpy((char *)buffer,logname,*bufferlength);
  }
logname要求获得登陆名,而板子一般没有登陆名,将其强制改为root即可
if (!gotlogin)
  {
  //     char *logname = getenv("LOGNAME");
         char *logname = "root";
         if (logname == 0)
                return ERR_RTP_SESSION_CANTGETLOGINNAME;
         strncpy((char *)buffer,logname,*bufferlength);
  }
(2)板子和PC收发数据不能接收
在PC和板子上同时运行jrtplib例子程序example1(此程序可同时收发),在PC和板子之间收发数据,程序能够运行但双方都接收不到数据,结果如下:
查阅资料发现是字节序和位域的问题,一般x86的pc机是用小端字节序(little endian),而嵌入式平台一般是大端字节序(big endian),可能是由于字节序的不同,导致了明明存在数据包,却认不出来的问题。
这是一个位域结构体,jrtplib库使用哪种字节序完全取决于RTP_BIG_ENDIAN的定义,这样问题就简单化了。
     看了一下我编译arm下jrtplib库的rtpconfig_unix.h这个文件,里面果然定义了一个RTP_BIG_ENDIAN,所以要和pc采用的小端字节序一样,先是直接在rtpconfig_unix.h中注释掉了
然后在重新编译库,执行
./configure –host=arm-linux –prefix=/usr/local/arm/2.95.3
make
make install
完了再次运行example1,还是不行,查看rtpconfig_unix.h发现刚注释掉到内容又恢复了,
最后查找发现是此文件是由./configure命令生成的,所以先执行./configure命令,然后再注释上面的内容,最后
make
make install
编译完成再次运行example1,能受到数据包,结果如下:
(3)自己写的接收程序写文件出错
接收端程序是在example3的基础上修改的,收到到数据包信息全部存在
RTPPacket *pack;
这个类指针当中,可以通过
uint8_t *data;
size_t *length;
data=pack->GetPayloadData();
length=pack->getPayloadLength();
提取出负载数据和负载长度。
收到数据以后以文件形式存下来。
if((write(outfile,data,length))<0)
  {
         perror("write outfile error;");
         return -1;
  }
最开始把打开文件放在开头,写入文件放在接收数据之后,但一直不能正确写文件,提示:
bad file descriptor
后来发现把打开文件放到写文件之前(即在接收数据到while循环之内)可以正确写数据,分析原因觉得可能是由于接收程序是一个多线程控制的而引起的。但是这样每次接收都要打开文件,会导致接收速度变慢,试着把打开文件放到循环外边发现也可以正确写数据,具体是什么原因导致这样暂时还不清楚。
(4)接收数据时有数据丢失现象,发送端发送数据时发现发送速度太快,所以数据瞬间发完,而不像例子程序一样一包一包的发送,最开始一直以为是设置时戳单元和时戳增量有问题,
sessparams.SetOwnTimestampUnit(1.0/1000.0);
sess.SetDefaultTimestampIncrement(10);
但改了几次还是没有变化,最后仔细对比例子程序,发现是
RTPTime ::Wait(RTPTime(0,0));
这个函数的位置放错了,此函数的作用就是发完一个包后等待一定时间(其中括号中第一个参数表示秒,第二个表示微秒),发送程序中将其放到了while循环之外,没有了这个等待时间而接收端还是以此间隔接收数据当然会丢失数据了,将其挪到循环之内就可以了。
二.    存在的问题和拟采取的解决方案
现在接收到的数据是以文件的形式存下来的,但是最后想要达到的目的是与MPlayer结合起来,使视频采集,压缩后的数据在接收端能够实时的播放出来,现在存在的问题就是如何把收到的数据流传到MPlayer中实时播放,下一阶段的工作首先是将MPlayer的源代码研究清楚,然后再想办法将接收数据实时传给MPlayer。
对于本博客有任何问题的朋友可加Q:992139738

转载于:https://blog.51cto.com/2343338/831528

Window平台实时流媒体相关推荐

  1. 实时流媒体编程基于Linux环境开发

    一.流媒体简介 随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡.目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒 ...

  2. Linux下的实时流媒体编程

    流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视 频会议.IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关 ...

  3. android集成EasyPlayer播放器播放实时流媒体视屏

    android集成EasyPlayer播放器播放实时流媒体视屏 最近公司项目需要实现一个rtsp实时流媒体视频的播放,在移动端尝试了多个第三方能播放rtsp流实时视频的软件后发现EasyPlayer的 ...

  4. 【ECharts系列|03可视化大屏】大数据管理平台实时展示

    基于echats实现可视化大数据管理平台实时展示. 完整html+css+js+json+font+video:https://download.csdn.net/download/weixin_41 ...

  5. 深入了解基于RTMP数据传输协议的实时流媒体技术(图解过程)一看就会【建议新手收藏】

    前言:本文来自论文<基于RTMP协议的流媒体技术的原理与应用>,文中研究了基于 Flash平台的流媒体系统中使用的RTMP 协议的原理和应用,并对网络上实时流媒体的各种传输方式的优缺点进行 ...

  6. linux运行rtsp,Linux下的实时流媒体编程(RTP,RTCP,RTSP)2

    RTP 是目前解决流媒体实时传输问题的最好办法,如果需要在Linux平台上进行实时流媒体编程,可以考虑使用一些开放源代码的RTP库,如LIBRTP. JRTPLIB等.JRTPLIB是一个面向对象的R ...

  7. RTSP协议探秘:从原理到C++实践,解锁实时流媒体传输之道

    目录标题 引言 RTSP协议基础 RTSP协议的组成与工作原理 RTSP协议的组成 RTSP协议的工作原理 RTSP协议与其他流媒体协议的比较 RTSP协议的基本功能与用途 RTSP协议详解 RTSP ...

  8. Linux下使用JRTPLIB进行实时流媒体编程

    收藏于 2013-04-22 迁移自本人的百度空间 -------------------------------- 转载自 http://blog.csdn.net/dongliqiang2006/ ...

  9. 电商平台实时监控系统丨前端项目的准备

    项目最终的效果如图所示: 最终效果涉及到6个图表, 5种图表类型,它们分别是折线图,柱状图,地图,散点图,饼图 每个图表的数据都是从后端推送到前端来的, 不过在项目的初期,我们会先使用 ajax 由前 ...

最新文章

  1. Python3中的json对象与python对象转化
  2. mysql create at_create_at update_at
  3. 数学建模学习笔记——主成分分析
  4. python turtle画圆、循环法_实验与作业(Python)-03 Python程序实例解析(函数、循环、range、turtle)...
  5. Linux环境Eclipse + Tomcat + MySQL 构造J2EE方法开发环境
  6. STC学习:看谁手速快
  7. 我的常用数据软件大公开
  8. cass道路设计教程_(完整版)南方CASS7.1绘制道路断面图教程
  9. 工商银行近20年实时大数据平台建设历程
  10. 九连环解法和小程序。
  11. defaults(default是什么职位)
  12. 转:宁愿在真实前颤抖,也不愿在催泪弹下哭泣(今何在)
  13. [MySQL]超市购物管理系统
  14. 暗组免杀php,那些强悍的PHP一句话后门
  15. SUSE 11 安装sybase ASE 16.0 SP 02安装全过程
  16. 为什么.bat脚本不断重复执行同一命令
  17. Java程序员职业发展规划和方向
  18. SRAMRAMROM介绍
  19. 计算机二级word难点大全,2019年3月计算机二级Word难点重点汇总
  20. 鞍点(MOOC 翁凯 C语言源码)

热门文章

  1. 服务器系统2012怎么多人连接,windows2012服务器TCP连接数
  2. 二维gabor滤波器matlab,matlab中实现Gabor滤波器 | 学步园
  3. 鸿蒙os首批适配机型,鸿蒙OS正式版首批名单曝光,适配速度让人意外,8款机型恭喜了...
  4. Java DICOM 网络传输_DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store
  5. java编译后生成字节码_请问java源文件编译后怎么生成字节码文件?
  6. java string document_java - String 和 document 的相互转换总结
  7. 印象笔记 还回快捷_模块化编辑器、OCR、素材库...一大波新功能来袭丨印象笔记7周年现场实况...
  8. (4)nginx:日志以及定时切割日志小例子
  9. (3) ebj学习:有状态bean和无状态bean区别
  10. java广度优先遍历