live555构建流媒体服务器(1)

2023-11-15

读test.264码流文件,客户端可以通过ffplay.exe rtsp: xxx播放出来。

直接使用编译好的库,改自testOnDemandRTSPServer.cpp

#include "liveMedia.hh"
#include "BasicUsageEnvironment.hh"
 
#pragma comment (lib, "Ws2_32.lib")  
#pragma comment (lib, "BasicUsageEnvironment.lib")
#pragma comment (lib, "groupsock.lib")
#pragma comment (lib, "liveMedia.lib")
#pragma comment (lib, "UsageEnvironment.lib")
UsageEnvironment* env;

// To make the second and subsequent client for each stream reuse the same
// input stream as the first client (rather than playing the file from the
// start for each client), change the following "False" to "True":
Boolean reuseFirstSource = False;

// To stream *only* MPEG-1 or 2 video "I" frames
// (e.g., to reduce network bandwidth),
// change the following "False" to "True":
Boolean iFramesOnly = False;

static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,
               char const* streamName, char const* inputFileName); // fwd

static char newMatroskaDemuxWatchVariable;
static MatroskaFileServerDemux* demux;
static void onMatroskaDemuxCreation(MatroskaFileServerDemux* newDemux, void* /*clientData*/) {
  demux = newDemux;
  newMatroskaDemuxWatchVariable = 1;
}

int main(int argc, char** argv) {
  // Begin by setting up our usage environment:
  TaskScheduler* scheduler = BasicTaskScheduler::createNew();
  env = BasicUsageEnvironment::createNew(*scheduler);

  UserAuthenticationDatabase* authDB = NULL;
#ifdef ACCESS_CONTROL
  // To implement client access control to the RTSP server, do the following:
  authDB = new UserAuthenticationDatabase;
  authDB->addUserRecord("username1", "password1"); // replace these with real strings
  // Repeat the above with each <username>, <password> that you wish to allow
  // access to the server.
#endif

  // Create the RTSP server:
  RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554, authDB);
  if (rtspServer == NULL) {
    *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n";
    exit(1);
  }

  char const* descriptionString
    = "Session streamed by \"testOnDemandRTSPServer\"";

  // Set up each of the possible streams that can be served by the
  // RTSP server.  Each such stream is implemented using a
  // "ServerMediaSession" object, plus one or more
  // "ServerMediaSubsession" objects for each audio/video substream.

 
  // A H.264 video elementary stream:
  {
    char const* streamName = "h264ESVideoTest";
    char const* inputFileName = "test.264";
    ServerMediaSession* sms
      = ServerMediaSession::createNew(*env, streamName, streamName,
                      descriptionString);
    sms->addSubsession(H264VideoFileServerMediaSubsession
               ::createNew(*env, inputFileName, reuseFirstSource));
    rtspServer->addServerMediaSession(sms);

    announceStream(rtspServer, sms, streamName, inputFileName);
  }



  // Also, attempt to create a HTTP server for RTSP-over-HTTP tunneling.
  // Try first with the default HTTP port (80), and then with the alternative HTTP
  // port numbers (8000 and 8080).

  //if (rtspServer->setUpTunnelingOverHTTP(80) || rtspServer->setUpTunnelingOverHTTP(8000) || rtspServer->setUpTunnelingOverHTTP(8080)) {
  //  *env << "\n(We use port " << rtspServer->httpServerPortNum() << " for optional RTSP-over-HTTP tunneling.)\n";
  //} else {
  //  *env << "\n(RTSP-over-HTTP tunneling is not available.)\n";
  //}

  env->taskScheduler().doEventLoop(); // does not return

  return 0; // only to prevent compiler warning
}

static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,
               char const* streamName, char const* inputFileName) {
  char* url = rtspServer->rtspURL(sms);
  UsageEnvironment& env = rtspServer->envir();
  env << "\n\"" << streamName << "\" stream, from the file \""
      << inputFileName << "\"\n";
  env << "Play this stream using the URL \"" << url << "\"\n";
  delete[] url;
}

 



FROM:  http://www.cnblogs.com/mlj318/archive/2013/01/22/2871967.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

live555构建流媒体服务器(1) 的相关文章

  • SSAS处理类型

    Type value Applicable objects ProcessFull Cube database dimension measure group mining model mining structure partition
  • cuda-GPU 加速

    global 主机调用 声明设备函数 在设备上 gpu 执行 device 设备上执行并从设备上调用 host 其他主机调用的主机函数 cudaMalloc 设备上分配内存 cudaMemcpy 别存复制到主机或设备上 cudaFree 释
  • PHP+Redis实现延迟任务 实现自动取消订单,自动完成订单

    简单定时任务解决方案 使用redis的keyspace notifications 键失效后通知事件 需要注意此功能是在redis 2 8版本以后推出的 因此你服务器上的reids最少要是2 8版本以上 A 业务场景 1 当一个业务触发以后
  • 什么是OLAP

    问题导读 1 为什么会出现OLAP应用 2 OLAP的度过了哪些发展历史 3 OLAP的基本内容有哪些 4 OLAP常见操作有哪些 OLAP Online AnalyticalProcessing 是一种数据处理技术 专门设计用于支持复杂的
  • 虚拟机Ubuntu系统安装与换源

    虚拟机Ubuntu系统安装与换源 1 ubuntu系统安装 1 1下载ubuntu镜像 https ubuntu com download desktop 1 2打开VMware 创建新的虚拟机 1 3选择自定义安装 1 4一直下一步到此界
  • pandas中DataFrame基本操作

    怎样删除list中空字符 最简单的方法 new list x for x in li if x 这一部分主要学习pandas中基于前面两种数据结构的基本操作 设有DataFrame结果的数据a如下所示 a b c one 4 1 1 two
  • 1658. 合法标识符

    1658 合法标识符 请判断字符串 str 是不是一个合法的标识符 合法的标识符由字母 A Z a z 数字 0 9 和下划线组成 并且首字符不能为数字 样例 样例 1 输入 str LintCode 输出 true 解释 因为 LintC
  • PySpark MLlib 机器学习算法库

    作者 禅与计算机程序设计艺术 1 简介 PySpark MLlib 是 Apache Spark 生态系统中的一个开源机器学习工具包 它提供了高级的API 包括分类 回归 聚类 协同过滤等 可以用来处理大数据集 并进行训练和预测分析 本文将
  • Picture Control的使用

    在对话上放了一个Picture控件 并载入一幅位图 将Picture的大小调得和位图的大小一样 在Windows2000下 但当我在Widnows98下再次运行这个对话框程序时 Picture控件变大了 整个对话框和其中的控件都变大了 但其
  • 如何开具SSCI论文的检索证明?

    在学术界中 无论是学位申请 奖学金申请 还是职称评审 都必须附上SSCI论文的检索报告 那么 如何开具SSCI论文检索证明呢 一种方法是自行前往所在学校或当地查新机构开具 另一种方法则是委托专业人员代为开具 作者需要了解可用于开具论文检索报
  • OpenFeign 基本介绍和原理了解

    了解 OpenFeign OpenFeign 组件的前身是 Netflix Feign 项目 后来 Feign 项目被贡献给了开源组织 才有了今天使用的 Spring Cloud OpenFeign 组件 OpenFeign 提供了一种声明
  • postman面试_使用Postman做接口测试

    Postman是一个接口测试工具 在做接口测试的时候 Postman相当于一个客户端 它可以模拟用户发起的各类HTTP请求 将请求数据发送至服务端 获取对应的响应结果 从而验证响应中的结果数据是否和预期值相匹配 并确保开发人员能够及时处理接
  • 小程序在线更新,发布后提示有新版本

    在小程序onLaunch时候查看是否有新版本 onLaunch function 小程序更新 const updateManager uni getUpdateManager updateManager onCheckForUpdate f
  • 怎么把jfif改成png格式?三招送给你

    怎么把jfif改成png格式 在我们实际办公的过程中 其电脑网页存储的图片格式可能就是jfif格式 很多人对于jfif格式较为陌生 且在一些应用场景无法直接打开jfif格式的图片进行操作 编辑 对我们办公效率造成了一些影响 在此过程中 需要

随机推荐

  • Python、PHP和Java下的反序列化漏洞复现实例

    环境准备 这篇文章旨在用于网络安全学习 请勿进行任何非法行为 否则后果自负 python反序列化 p83 CTF夺旗 Python考点SST 反序列化 字符串 正经人 的博客 CSDN博客 php反序列化 p84 CTF夺旗 PHP弱类型
  • vue注册全局指令

    Vue directive focus 只调用一次 指令第一次绑定到元素时调用 在这里可以进行一次性的初始化设置 bind el binding console log bind el binding el触发的元素 console log
  • BeanFactoryAware

    在使用spring编程时 常常会遇到想根据bean的名称来获取相应的bean对象 这时候 就可以通过实现BeanFactoryAware来满足需求 代码很简单 Service public class BeanFactoryHelper i
  • 免费开源的高精度OCR文本提取,支持 100 多种语言、自动文本定位和脚本检测,几行代码即可实现离线使用(附源码)

    免费开源的高精度OCR文本提取 支持 100 多种语言 自动文本定位和脚本检测 几行代码即可实现离线使用 附源码 要从图像 照片中提取文本吗 是否刚刚拍了讲义的照片并想将其转换为文本 那么您将需要一个可以通过 OCR 光学字符识别 识别文本
  • uniapp引入图表ucharts方法

    Ucharts官网 https demo ucharts cn HBuilderX插件市场 https ext dcloud net cn 进入HBuilderX插件市场安装ucharts插件 进入ucharts官网找到需要的图表复制代码
  • 设计模式 简单工厂,策略模式,几种基本原则,Unity基础

    学习笔记 感受设计演变过程中蕴含的大智慧 体会乐于怒的程序人生中值得回味的一幕幕 设计模式来自于建筑领域 作为软件工程的一个分支 是在软件工程实践过程中 程序员们总结出的良好的编程方法 第一种模式 简单工厂模式 图片来源 点这里 上面是简单
  • RAM IP core(2)

    例化5种RAM IP core 1 单端口RAM Single port RAM RAM参数设置如上图所示 输入输出位宽都为8位 深度为16 采用一级输出寄存器 读写模式为no change 用COE文件对RAM进行初始化 关于COE文件的
  • BurpSuit在不同浏览器中配置代理

    BurpSuit配置代理 一 BurpSuit代理基础知识 通常情况下 用户通过浏览器浏览网页 通过浏览器 客户端 与服务器进行交互 既相互进行通信 若要想分析客户端和服务器交互的具体信息 就需要一个人当个中介 中间人 可以拦截两个人的信息
  • HTML5基础知识总结

    文章目录 01 HTML5基础 了解HTML5 新语义标签 网页布局结构标签及兼容处理 多媒体标签及属性介绍 新表单元素及属性 智能表单控件 表单属性 HTMl5中的API 获取页面元素及类名操作和自定义属性 文件读取 获取网络状态 获取地
  • sql union 列的字段不一样的时候

    转载于 https www cnblogs com shenzhichipingguo p 8916705 html
  • 69-Sqrt(x)

    题目 Implement int sqrt int x Compute and return the square root of x 分析 这个题里面是有许多陷阱的 首先确定用二分法处理这个问题 然而0 x之间的num的平方有可能会溢出
  • Apifox接口测试教程(一)接口测试的原理与工具

    前言 掌握了http协议 就掌握了接口测试 笔者在网络上看过不少接口测试教程 一上来就开始讲怎么操作工具 而不告诉读者为什么要这么操作 读者可能照猫画虎成功了 也可能操作失败了但不知为何出错 因此 本文作为接口测试的入门第一课首先会给大家了
  • 静态代码分析工具(一)—Scitools Understand

    一 概述 Understand是一个用来进行静态的软件分析 软件度量 软件可视化的工具 二 软件使用 1 安装 安装的是Understand 5 1 安装及另起可用网上很多资源 2 新建工程 创建工程名称 路径 选择语言 注意 在C C 后
  • (cLion、RubyMine、PyCharm、WebStorm、PhpStorm、Appcode、Clion、Idea) 万能破解,获取自己的注冊码...

    听说cLion的ide编写c c 很的棒 今天下载了一个仅仅有30天的使用时间 作为程序猿破解它 下载破解文件 点击下载 password 7biu 解压压缩包 然后打开命令行 cd 到解压文件夹 运行例如以下命令 java jar bui
  • HTTP协议初探

    发现网络协议的知识对后台开发人员来说 还是非常重要的 所以特地去了解了以下 并作学习笔记 方便自己查阅 HTTP协议详解 HTTP就是一个基于应用层的通信规范 双方要进行通信 大家都要遵守一个规范 HTTP协议 HTTP协议从WWW服务器传
  • 数值计算 --- 三次样条函数插值(Cubic spline function interpolation)

    三次样条函数插值 Cubic spline function interpolation Part I 插值 预备知识 什么是插值 已知部分离散的数据 但不知道满足这些数据的函数表达式 插值 和拟合 都是为了找到对应的函数表达式 区别在于
  • Python 积累总结

    for i j in DataFrame 遇到的问题 for i j in new data groupby by embryo id company id if j shape 0 2 relationshipdata relations
  • Android中Log信息的输出方法

    共两篇文章 第一篇讲述了如何在程序中输出Log信息 第二篇详细的分析了Log信息的输出机制 下面是第一篇 转自 http blog 163 com binghaitao 126 blog static 3383532520099309366
  • Angular 4/5 form表单select初始化选中(简单string和复杂对象)

    1 问题场景 管理员增删改查中的 改 操作 管理员有性别 sex 和岗位 position 属性 其中 性别在后端为枚举类型 position为类 要求进入管理员修改页时 自动选择性别 通过接口获取所有岗位 并自动选中当前管理员的岗位 2
  • live555构建流媒体服务器(1)

    读test 264码流文件 客户端可以通过ffplay exe rtsp xxx播放出来 直接使用编译好的库 改自testOnDemandRTSPServer cpp include liveMedia hh include BasicUs