文档章节

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

雷霄骅
 雷霄骅
发布于 2013/09/30 18:18
字数 579
阅读 3.8K
收藏 6

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

© 著作权归作者所有

雷霄骅

雷霄骅

粉丝 215
博文 419
码字总数 2129
作品 4
朝阳
程序员
私信 提问
加载中

评论(0)

基于Hi3516A的H265 IPC LIVE555 开发基本原理

转载于http://m.blog.csdn.net/faihung/article/details/73008742,如有侵权,请告知删除。 1 系统工作原理 系统以Hi3516A开发平台(由高分辨率1080 p的AR0330摄像头模块和带千兆以太网功能的...

oqqHuTu12345678
2018/01/02
0
0
基于Live555实现RtspServer及高清高码率视频传输优化

基于Live555实现RtspServer及高清高码率视频传输优化 最近做了一些pc和嵌入式平台的RTSP服务器项目,大多数的要求是简单但是功能全面,并且性能还要强劲。综合考虑后,基本都是在基于live555...

haibindev
2018/08/20
0
0
基于EasyDarwin开源流媒体服务器框架实现EasyNVR H5无插件直播流媒体服务器方案

版权声明:本文为EasyDarwin开源社区原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiejiashu/article/details/90083897 背景分析 在之前的一篇博客《web无插件播放RTSP摄像机方案...

xiejiashu
2019/05/10
0
0
Live555源码在vs2010/vs2013中的编译

文章是转载自http://www.cnblogs.com/skyseraph/archive/2012/04/11/2442840.html 按照原文章的编译方式是编译不过的,做了一些修改。按照如下的方式可以编译 Ⅰ live555简介   Live555 是...

BIGBurning
2015/01/04
0
0
VLC 和 MPlayer 使用的流媒体库被曝出高危漏洞

外媒消息,思科 Talos 团队的安全研究人员在 LIVE555 流媒体库中发现了一个严重的代码执行漏洞。该库正被用于包括 VLC 和 MPlayer 在内的多款流行播放器中。 由 Live Networks 开发和维护的 ...

王练
2018/10/23
1.3K
1

没有更多内容

加载失败,请刷新页面

加载更多

[ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?

昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是否有好...

osc_n0c6719w
26分钟前
26
0
团队作业第三次—项目需求分析

这个作业属于哪个课程 2020春|S班 (福州大学) 这个作业要求在哪里 团队作业第三次—项目需求分析 团队名称 如果有一天我变得很有钱 这个作业的目标 1.原型设计、2.类图设计、3.需求规格说明书...

osc_bcvwusz2
27分钟前
23
0
流媒体服务器、海康威视 大华摄像头实现视频监控、直播解决方案

  随着互联网+物联网进程的加快,视频监控应用领域变得越来越广泛,其中海康威视 大华等品牌的摄像头频繁出现在视野中。由于去年也实现过智慧工地项目上的视频监控方案,加上当今直播趋势不...

osc_47qtuhkb
29分钟前
18
0
流媒体服务器、海康威视 大华摄像头实现视频监控、直播解决方案

  随着互联网+物联网进程的加快,视频监控应用领域变得越来越广泛,其中海康威视 大华等品牌的摄像头频繁出现在视野中。由于去年也实现过智慧工地项目上的视频监控方案,加上当今直播趋势不...

osc_1qix3fyb
30分钟前
35
0
thymeleaf中使用javascript中的[[]]的3种处理方式

thymeleaf中使用javascript中的[[]]的处理方式 1: 使用 CDATA 模式 /* <![CDATA[ */ 和 /* ]]> */就OK了 <script th:inline='javascript'>/* <![CDATA[ *//* ]]> */</script> 2:......

独钓渔
31分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部