live555 直播arm-linux视频
live555例程testOnDemandRTSPServer.cpp启动一个流服务器
首先启动使用环境,
TaskScheduler* scheduler = BasicTaskScheduler::createNew();
env = BasicUsageEnvironment::createNew(*scheduler);
然后创建rtsp服务器实例
RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554, authDB);
if (rtspServer == NULL) {
*env << "Failed to create RTSP server: " << env->getResultMsg() << "\n";
exit(1);
}
// 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.
然后启动每一种rtsp服务器支持的流媒体服务,每种流媒体都使用媒体服务会话(ServerMediaSession)对象,
而每个媒体服务会话都包含一个或多个子会话(视频或音频)。
如果流媒体类型是h264,在testOnDemandRTSPServer中,是从文件读取流媒体,其流程为
char const* streamName = "h264ESVideoTest";
char const* inputFileName = "out.h264";
ServerMediaSession* sms
= ServerMediaSession::createNew(*env, streamName, streamName,
descriptionString);
sms->addSubsession(H264VideoFileServerMediaSubsession
::createNew(*env, inputFileName, reuseFirstSource));
rtspServer->addServerMediaSession(sms);
即首先创建一个媒体服务会话,然后给该媒体服务会话添加视频子会话,而视频子会话是
h264文件媒体服务子会话,用H264VideoFileServerMediaSubsession表示。
然后将媒体服务会话添加到rtsp服务进程中。
而要想从内存读取流媒体,关键就是要修改视频子会话,将视频子会话从读取文件改为读取内存。
原本的H264VideoFileServerMediaSubsession继承关系是
class H264VideoFileServerMediaSubsession: public FileServerMediaSubsession
class FileServerMediaSubsession: public OnDemandServerMediaSubsession
从类的名字即可看出是从文件读取视频流还是从内存读取视频流基类都应该是OnDemandServerMediaSubsession。
FileServerMediaSubsession是一个纯虚类。
那么H264VideoFileServerMediaSubsession中决定从文件读取视频流的函数是哪个呢?
FramedSource* H264VideoFileServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) {
estBitrate = 500; // kbps, estimate
// Create the video source:
ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName);
if (fileSource == NULL) return NULL;
fFileSize = fileSource->fileSize();
// Create a framer for the Video Elementary Stream:
return H264VideoStreamFramer::createNew(envir(), fileSource);
}
由此可见关键函数是createNewStreamSource。
因而可以创建类H264VideoMemoryBufferServerMediaSubsession
继承关系为
class H264VideoMemoryBufferServerMediaSubsession: public MemoryBufferServerMediaSubsession
class MemoryBufferServerMediaSubsession: public OnDemandServerMediaSubsession
两个类与class H264VideoFileServerMediaSubsession: public FileServerMediaSubsession相比,仅将从文件读改为内存读
关键在于将函数
FramedSource* H264VideoMemoryBufferServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, Params& params)
params是传递的参数结构体。
在live555文档http://www.live555.com/liveMedia/doxygen/html/inherits.html中可以看到,从FramedSource继承的类中有一个类是DeviceSource。
它是一个模板封装了音视频设备的接口A template for a MediaSource encapsulating an audio/video input device。
把这个类copy出来换一个类名,实现其中还有需要实现的函数即可。用在项目中确实可行。
live555 直播arm-linux视频的更多相关文章
- 【视频开发】【Live555】摄像头采集,264编码,live555直播
加入 摄像头采集和264编码,再使用live555直播 1.摄像头采集和264编码 将x264改成编码一帧的接口,码流不写入文件而是直接写入内存中(int Encode_frame 函数中). /* ...
- H5 的直播协议和视频监控方案
H5 的直播协议和视频监控方案 一.流媒体主要实现方式 二.流媒体技术 2.1 流媒体 2.2 直播 2.3 流协议 2.3.1 HLS 协议 2.3.2 RTMP 协议 2.3.3 RTSP 协议 ...
- linux视频录制,推流处理
1.linux视频合成(视频后缀要一致) ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -lavfi hstack=inputs=3 4.mp4 (input=3表示希望合并的视 ...
- 009-2010网络最热的 嵌入式学习|ARM|Linux|wince|ucos|经典资料与实例分析
前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到21ic和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友 ...
- iOS 直播-获取音频(视频)数据
iOS 直播-获取音频(视频)数据 // // ViewController.m // capture-test // // Created by caoxu on 16/6/3. // Copyri ...
- Linux 视频设备驱动V4L2最常用的控制命令
http://blog.csdn.net/shaolyh/article/details/6583226 Linux 视频设备驱动V4L2最常用的控制命令使用说明(1.02) 命令 功能 VIDIOC ...
- ARM Linux Qt 5.x.x 无标题栏
/********************************************************************************* * ARM Linux Qt 5. ...
- 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识
驱动开发读书笔记. 0.06 嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB v ...
- 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS
上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...
- 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel
经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...
随机推荐
- ZooKeeper程序员指南(转)
译自http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html 1 简介 本文是为想要创建使用ZooKeeper协调服务优势的分布式 ...
- [HTML5]原生事件绑定和jquery动态事件绑定的区别
原生事件绑定: <!-- 标签上绑定的事件是由window对象帮助调用,因此方法内的this其实是window对象 --> <label><input type=&quo ...
- Celery 和 Redis 入门
Celery 是一个广泛应用于网络应用程序的任务处理系统. 它可以在以下情况下使用: 在请求响应周期中做网络调用.服务器应当立即响应任何网络请求.如果在请求响应周期内需要进行网络调用,则应在周期外完成 ...
- elasticsearch知识点
1.分析:数据转化的过程. 两个转化过程-----传入文档中的数据转化程倒排序索引 -----查询文本转化成可被搜索的词 2.分析器:承担分析(数据转化)的工作 组成:一个分词器(tokenizer) ...
- [Tex学习笔记]开方
$$\sqrt[n]{\frac{a}{b}}$$ $$\sqrt[\uproot{7}n]{\frac{a}{b}}$$
- PHP截断函数mb_substr()详细介绍
[导读] 在php中mb_substr()函数是用来截中文与英文的函数,可以方便快速的解决截取指定字符长度的问题,下面我来给大家介绍介绍.提示:mb_substr在于php中是默认不被支持的我们需要在 ...
- 通过DOM节点操作来获取表单信息
这是之前突发奇想地用dom节点的关系来操作表单的故事.. 事情的经过是这样的,大概就是一个平台注册后有留言功能,管理员登录之后可以对这些留言进行回复.这个页面呢,就是通过foreach获取到数据库里的 ...
- System.exit(1)
用于退出java的虚拟机,也是finally块中语句不被执行的唯一情况
- MSSQL导入导出数据
/******* 导出到excel */ EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S&qu ...
- Symfony2 资料篇
http://www.chrisyue.com/symfony2-in-action-day-1.html 由于Symfony2现在还没有很完善的中文文档,所以不想看文档的同学可以直接进行点击上面的链 ...