H264实时流传输方案在Windows下使用RTSPlive555实现

H264实时流传输方案在Windows下使用RTSPlive555实现
在项目前处理的H264视频数据到客户端最近使用RTSP协议,上网查了一下,发现有人张贴代码以上Windows Linux的基本不能用,所以以下分享与Windows系统的live555球员RTSP协议,需要的朋友可以参考
在它的名称,最近的项目需要使用RTSP协议转发处理H264视频数据到上层的客户,环境是Windows下的,所以看起来代码各种百度谷歌。同时,利用live555进行一个相对简单的结论结果也悲哀地发现,在互联网上发布的代码基本上是Linux。修改后的两份申请窗口,它再次被困在无尽的百度谷歌搜索。反正最后解决它,所以我把代码与你分享。我希望它能启发孩子们的鞋子与我的需求相似,我希望一些专家能纠正他们的问题。

RTSP使用live555发挥基本上是通过修改本地文件演示了实现。但由于其演示的封装,它是改变他的fread代码到一份记忆直接实现实时传输很尴尬。本文参考了网上的一些代码,因为来自h264videofileservermediasubsession处理定义了一个类,并定义一个类继承framedsource做内存拷贝操作,这种差异也读本地文件和实时流量的关键。

代码如下。如果你觉得有必要或者是懒得去建立你自己的live555的环境,你可以下载这个项目的最后一个环节(环境下)。如果你的VS版本是合适的,你可以直接运行
主文件(程序入口)
#包括h264livevideoservermediasubssion。HH
#包括h264framedlivesource。HH
#包括LiveMedia。HH
#包括basicusageenvironment。HH

A: #定义1024×200

静态announcestream(rtspserver * rtspserver,servermediasession *短信,char const* streamname) / RTSP连接信息显示
{
char * URL = rtspserver -> rtspurl(SMS);
usageenvironment env = rtspserver ->环境();
env << streamname << ;
>使用URL播放此流;
删除URL;
}

int main(int argc、argv char *)
{
设置
usageenvironment指针;
布尔reusefirstsource = false; / /如果true另一个是客户端访问的第一个客户看相同的视频流,或其他客户端访问会玩了
*::= basictaskscheduler TaskScheduler调度器创建();
env = basicusageenvironment::创造新的(*调度);

/ /创建RTSP服务
userauthenticationdatabase * authdb = null;
rtspserver * rtspserver = rtspserver::创造(指针,8554,authdb);
如果(rtspserver = = null){
*环境getresultmsg()<< ';
出口(1);
}
char const* descriptionstring =会话流的testondemandrtspserver ;

与发送相关的流量变量的实时模拟
int数据大小; / /数据长度
unsigned char * databuf; / /指针数据区
databuf =(unsigned char *)malloc(1024×1024);
布尔不; / / RTSP发送标志位,叫真,否则退出

将文件拷贝到内存中,作为内存实时网络传输仿真,如果实时网络传输应该是双线程结构,则添加线程锁定在这里。
此外 /实时传输数据的副本应在h264framedlivesource文件出现,这是从上往下传递一个指向它的指针在过去
文件*;
fopen_s(PF,264 测试。
fread(databuf,1,BUFSIZE,PF);
A: DataSize =;
不=真;
Fclose(PF);

除了对模拟网络/传输部分和其他基本live555提供演示的上部和下面是修改网络传输,因此第一个参数覆盖addsubsession相关文件
char const* streamname =h264esvideotest ;
servermediasession *短信= servermediasession::创造(指针,streamname,streamname,descriptionstring);
短信-> addsubsession(h264livevideoservermediasubssion::创造(指针,reusefirstsource,数据大小,databuf,不)); / /修改自己实施h264livevideoservermediasubssion
rtspserver -> addservermediasession(SMS);

announcestream(rtspserver,短信,streamname); / /提示用户输入连接信息
(env -> TaskScheduler)(。doeventloop); / /等待循环连接

自由(databuf); / /释放内存
返回0;
}

自定义h264videofileservermediasubsession类

h264videofileservermediasubsession.hh

#则_h264_live_video_server_media_subsession_hh
#定义_h264_live_video_server_media_subsession_hh
#包括h264videofileservermediasubsession。HH

h264livevideoservermediasubssion类:公共h264videofileservermediasubsession {

公共:
静态h264livevideoservermediasubssion *新(usageenvironment env,布尔reusefirstsource DataSize,int,unsigned char * databuf,X);

保护的:一个虚拟基类
h264livevideoservermediasubssion(usageenvironment env,布尔reusefirstsource DataSize,int,unsigned char * databuf,布尔*不);
~ h264livevideoservermediasubssion();

受保护:重新定义虚拟函数
framedsource * createnewstreamsource(无符号clientsessionid,符号estbitrate);
公共:
焦ffilename { 100 };

int * server_datasize; / /指针数据大小
unsigned char * server_databuf; / /指针数据区
布尔* server_dosent; / /发送标志
};
# endifh264videofileservermediasubsession.cpp
#包括h264livevideoservermediasubssion。HH
#包括h264framedlivesource。HH
#包括h264videostreamframer。HH

h264livevideoservermediasubssion * h264livevideoservermediasubssion::创造(usageenvironment env,布尔reusefirstsource DataSize,int,unsigned char * databuf,玉)。
{
返回新的h264livevideoservermediasubssion(env,reusefirstsource,数据大小,databuf,不);
}

h264livevideoservermediasubssion::h264livevideoservermediasubssion(usageenvironment env,布尔reusefirstsource DataSize,int,unsigned char * databuf,符号)。
h264videofileservermediasubsession(env,ffilename,reusefirstsource) / / h264videofileservermediasubsession不是一个文件,我们需要修改,
但是我们也应该使用它来初始化函数,
所以把一个空数组放进去
{
server_datasize = DataSize; / /指针数据大小
server_databuf = databuf; / /指针数据区
server_dosent =不 / /送标;
}

h264livevideoservermediasubssion::~ h264livevideoservermediasubssion()
{
}

framedsource * h264livevideoservermediasubssion::createnewstreamsource(无符号clientsessionid,符号estbitrate)
{
继续做:分配estbitrate / * * /
estbitrate = 1000; / / kbps,估计

创建视频源
h264framedlivesource * livesource = h264framedlivesource::创造新的(环境),(server_datasize,server_databuf,server_dosent);
如果(livesource = null)
{
返回null;
}

创建一个帧的视频/基本流:
返回h264videostreamframer::创造新的(环境),(livesource);
}
自定义h264framedlivesource类

h264framedlivesource.hh
#则_h264framedlivesource_hh
#定义_h264framedlivesource_hh

#包括
h264framedlivesource类:公共framedsource
{
公共:
静态h264framedlivesource *新(usageenvironment env,int * DataSize,unsigned char * databuf,布尔*不,创造= 0)。

受保护的:
h264framedlivesource(usageenvironment env,int * DataSize,unsigned char * databuf,布尔*不preferredframesize,符号,和databuf)。
~ h264framedlivesource();

私人:
虚dogetnextframe();
国际transportdata(unsigned char *,符号为);

受保护的:
int * framed_datasize; / /指针数据大小
unsigned char * framed_databuf; / /指针数据区
布尔* framed_dosent; / /发送标志

国际readbufsize; / /读取数据记录大小
国际bufsizel; / /数据记录区域的大小
};

# endifh264framedlivesource.cpp
#包括h264framedlivesource。HH

h264framedlivesource::h264framedlivesource(usageenvironment env,int * DataSize,unsigned char * databuf,布尔*不*,bool,数据大小)。
framedsource(env)
{
framed_datasize = DataSize; / /指针数据大小
framed_databuf = databuf; / /指针数据区
framed_dosent =不 / /送标;
}

h264framedlivesource * h264framedlivesource::创造(usageenvironment env,int * DataSize,unsigned char * databuf,布尔*不,俞
{
h264framedlivesource *新元=新h264framedlivesource(env,数据大小,databuf,不,preferredframesize,playtimeperframe);
返回该;
}

h264framedlivesource::~ h264framedlivesource()
{
}

无效h264framedlivesource::dogetnextframe()
{
如果(* framed_dosent = true)
{
* framed_dosent = false;
bufsizel = * framed_datasize;
readbufsize = 0;

fframesize = fmaxsize;
Memcpy(FTO,framed_databuf + readbufsize,fframesize);
readbufsize = fframesize;
}
其他的
{
如果(bufsizel - readbufsize > fmaxsize)
{
fframesize = fmaxsize;
Memcpy(FTO,framed_databuf + readbufsize,fframesize);
readbufsize = fframesize;
}
其他的
{
Memcpy(FTO,framed_databuf + readbufsize,bufsizel - readbufsize);
* framed_dosent =真;
}
}

(nexttask)=环境(,(原理),ScheduleDelayedTask(0)、(taskfunc *)后,这framedsource::); / /说的在功能实现后0秒的延迟
返回;
}
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部