博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Live555类库实现的网络直播系统
阅读量:6214 次
发布时间:2019-06-21

本文共 3691 字,大约阅读时间需要 12 分钟。

hot3.png

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_SSMBoolean const isSSM = True;#elseBoolean const isSSM = False;#endif#define TRANSPORT_PACKET_SIZE 188#define TRANSPORT_PACKETS_PER_NETWORK_PACKET 7UsageEnvironment* env;char const* inputFileName = "test.ts";FramedSource* videoSource;RTPSink* videoSink;void play(); // forwardint 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);}

完整工程下载地址:

转载于:https://my.oschina.net/leixiaohua1020/blog/165455

你可能感兴趣的文章
VSphere入门之ESXi的安装及基本管理
查看>>
美国力登的最新KVM-Over-IP
查看>>
基于GNS3的独臂路由配置
查看>>
大数据之---Hive全网最详细的编译tar及部署终极篇
查看>>
Struts2中出现没有Action与之关联时
查看>>
Hadoop学习笔记(四)
查看>>
Log4j2配置文件详解
查看>>
我的友情链接
查看>>
Android MVP 框架 Demo
查看>>
分布式事务 CAP 理解论证 解决方案
查看>>
Ubuntu 12.04安装及配置vsftp步骤
查看>>
ipv6地址格式
查看>>
基于虚拟用户的电子邮件系统
查看>>
Java日期和日历相关的面试题
查看>>
CentOS 6.3(x86_32)下安装Oracle 10g R2
查看>>
MySQL三大范式
查看>>
nginx在reload时候报错invalid PID number
查看>>
javascript对象---2 构造函数
查看>>
写着好玩的(7)——IP地址+DHCP
查看>>
记一次云计算测试实验-openstack-icehouse-安装nova
查看>>