使用Live555类库实现的网络直播系统

Live555主要有四个类库:

libUsageEnvironment.lib;libliveMedia.lib;libgroupsock.lib;libBasicUsageEnvironment.lib

将这四个类库以及相关的头文件导入VC++2010之后,可以轻松实现网络直播系统。

在这里直接贴上完整代码,粘贴到VC里面就可以运行。

注:程序运行后,使用播放器软件(VLC Media Player,FFplay等),打开URL:rtp://239.255.42.42:1234,即可收看直播的视频。

// 网络直播系统.cpp : 定义控制台应用程序的入口点。
// 雷霄骅
// 中国传媒大学/数字电视技术
// leixiaohua1020@126.com

#include "stdafx.h"

#include "liveMedia.hh"
#include "BasicUsageEnvironment.hh"
#include "GroupsockHelper.hh"

//#define IMPLEMENT_RTSP_SERVER
//#define USE_SSM 1
#ifdef USE_SSM
Boolean const isSSM = True;
#else
Boolean const isSSM = False;
#endif



#define TRANSPORT_PACKET_SIZE 188
#define TRANSPORT_PACKETS_PER_NETWORK_PACKET 7


UsageEnvironment* env;
char const* inputFileName = "test.ts";
FramedSource* videoSource;
RTPSink* videoSink;

void play(); // forward

int main(int argc, char** argv) {
  // 首先建立使用环境:
  TaskScheduler* scheduler = BasicTaskScheduler::createNew();
  env = BasicUsageEnvironment::createNew(*scheduler);

  // 创建 'groupsocks' for RTP and RTCP:
  char const* destinationAddressStr
#ifdef USE_SSM
    = "232.255.42.42";
#else
    = "239.255.42.42";
  // Note: 这是一个多播地址。如果你希望流使用单播地址,然后替换这个字符串与单播地址  
#endif
  const unsigned short rtpPortNum = 1234;
  const unsigned short rtcpPortNum = rtpPortNum+1;
  const unsigned char ttl = 7; //


  struct in_addr destinationAddress;
  destinationAddress.s_addr = our_inet_addr(destinationAddressStr);
  const Port rtpPort(rtpPortNum);
  const Port rtcpPort(rtcpPortNum);

  Groupsock rtpGroupsock(*env, destinationAddress, rtpPort, ttl);
  Groupsock rtcpGroupsock(*env, destinationAddress, rtcpPort, ttl);
#ifdef USE_SSM
  rtpGroupsock.multicastSendOnly();
  rtcpGroupsock.multicastSendOnly();
#endif

  // 创建一个适当的“RTPSink”:

  videoSink =
    SimpleRTPSink::createNew(*env, &rtpGroupsock, 33, 90000, "video", "mp2t",
			     1, True, False /*no 'M' bit*/);


  const unsigned estimatedSessionBandwidth = 5000; // in kbps; for RTCP b/w share
  const unsigned maxCNAMElen = 100;
  unsigned char CNAME[maxCNAMElen+1];
  gethostname((char*)CNAME, maxCNAMElen);
  CNAME[maxCNAMElen] = '\0'; 
#ifdef IMPLEMENT_RTSP_SERVER
  RTCPInstance* rtcp =
#endif
    RTCPInstance::createNew(*env, &rtcpGroupsock,
			    estimatedSessionBandwidth, CNAME,
			    videoSink, NULL /* we're a server */, isSSM);
  // 开始自动运行的媒体

#ifdef IMPLEMENT_RTSP_SERVER
  RTSPServer* rtspServer = RTSPServer::createNew(*env);
  
  if (rtspServer == NULL) {
    *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n";
    exit(1);
  }
  ServerMediaSession* sms
    = ServerMediaSession::createNew(*env, "testStream", inputFileName,
		   "Session streamed by \"testMPEG2TransportStreamer\"",
					   isSSM);
  sms->addSubsession(PassiveServerMediaSubsession::createNew(*videoSink, rtcp));
  rtspServer->addServerMediaSession(sms);

  char* url = rtspServer->rtspURL(sms);
  *env << "Play this stream using the URL \"" << url << "\"\n";
  delete[] url;
#endif

 
  *env << "开始发送流媒体...\n";
  play();

  env->taskScheduler().doEventLoop(); 

  return 0; // 只是为了防止编译器警告

}

void afterPlaying(void* /*clientData*/) {
  *env << "...从文件中读取完毕\n";

  Medium::close(videoSource);
  // 将关闭从源读取的输入文件

  play();
}

void play() {
  unsigned const inputDataChunkSize
    = TRANSPORT_PACKETS_PER_NETWORK_PACKET*TRANSPORT_PACKET_SIZE;

  // 打开输入文件作为一个“ByteStreamFileSource":

  ByteStreamFileSource* fileSource
    = ByteStreamFileSource::createNew(*env, inputFileName, inputDataChunkSize);
  if (fileSource == NULL) {
    *env << "无法打开文件 \"" << inputFileName
	 << "\" 作为 file source\n";
    exit(1);
  }

  
  videoSource = MPEG2TransportStreamFramer::createNew(*env, fileSource);

  
  *env << "Beginning to read from file...\n";
  videoSink->startPlaying(*videoSource, afterPlaying, videoSink);
}

完整工程下载地址:http://download.csdn.net/detail/leixiaohua1020/6272839



  • 0
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
您好,感谢您的提问。下面是我对您问题的回答: 要在Windows系统下搭建流媒体服务,需要使用FFmpeg、live555和NGINX三个工具。其中FFmpeg是用于将视频文件转码为流媒体格式,live555是用于将转码后的流媒体数据发送到NGINX服务器,NGINX则是用于提供HTTP协议的流媒体服务。 具体的操作步骤如下: 1. 安装FFmpeg 首先需要从官网下载FFmpeg的Windows二进制版本,并将其解压到某个目录下。然后使用命令行工具进入到该目录,执行以下命令来测试FFmpeg是否安装成功: ``` ffmpeg -version ``` 如果输出了FFmpeg的版本信息,则表示安装成功。 2. 将视频文件转码为流媒体格式 使用FFmpeg将视频文件转码为流媒体格式,例如MP4或FLV等。具体的命令如下: ``` ffmpeg -i input.mp4 -c copy -f flv rtmp://localhost:1935/live/stream ``` 其中,input.mp4是要转码的视频文件,-c copy表示直接将视频流拷贝到输出文件中,-f flv表示输出格式为FLV,rtmp://localhost:1935/live/stream是NGINX服务器的RTMP地址。 3. 安装live555 live555是用于将转码后的流媒体数据发送到NGINX服务器的工具。需要从官网下载Windows版的live555,并将其解压到某个目录下。 4. 配置NGINX 在NGINX的配置文件中添加以下内容: ``` rtmp { server { listen 1935; application live { live on; } } } ``` 其中,listen 1935表示监听1935端口,application live表示将流媒体数据发送到名为live的应用中,live on表示开启直播功能。 5. 启动live555和NGINX 使用命令行工具进入到live555的目录下,执行以下命令启动live555: ``` live555MediaServer.exe ``` 然后进入到NGINX的目录下,执行以下命令启动NGINX: ``` nginx.exe ``` 6. 观看视频 使用VLC等流媒体播放器,输入以下URL来观看视频: ``` rtmp://localhost:1935/live/stream ``` 其中,localhost表示NGINX服务器所在的主机名或IP地址,1935是RTMP协议的默认端口号,live是应用名称,stream是流名称,即视频文件名。 希望我的回答对您有所帮助。如果还有其他问题,请随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值