在项目前
处理的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秒的延迟
返回;
}