uos操作系统中使用QT开发RTSP 视频流服务器,以下的实现方式使用的是单播方式,除了单播模式还有多播模式。
可以通过自己开发的rtsp服务器将摄像头的数据时时推送到服务器中,其他用户可以通过访问视频流地址rtsp://127.0.1.1:8554/live,直接访问摄像头播放的内容,也就是通常说的摄像头直播。本篇文章使用开源框架live555开发一个属于自己的视频流服务器。
安装环境依赖
live555的使用需要较多的环境依赖,一下安装都是编译依赖相关内容。
由于只是一个小demo,因此没有做成debian的依赖关系,不过我们可以通过以下命令安装。
代码语言:javascript复制sudo apt install liblivemedia-dev
sudo apt install libbasicusageenvironment1
sudo apt install libgroupsock8
sudo apt install libusageenvironment3
sudo apt install libasound2-dev
sudo apt install libx264-dev
sudo apt install libfaac-dev
编译环境
qt环境版本说明。
操作系统:统信uos操作系统
编码
代码语言:javascript复制#include "mainwindow.h"
#include <QApplication>
#include <QCameraInfo>
#include "live/V4l2H264DevUnicastServerMediaSubsession.h"
#include "live/V4l2H264DevMulticastServerMediaSubsession.h"
#include "live/AlsaAACDevUnicastServerMediaSubsession.h"
#include "live/AlsaAACDevMulticastServerMediaSubsession.h"
int main(int argc, char* argv[])
{
// 获取所有的摄像头信息
QList<QCameraInfo> lists = QCameraInfo::availableCameras();
foreach (auto item, lists) {
qInfo() << item.description();
qInfo() << item.deviceName();
}
int port = 8554; // 端口号
int videoWidth = 320; // 宽高
int videoHeight = 240;
int videoFps = 15; // 帧率
int index = -1; // 设备序号,因为有可能有多个设备。
std::string audioSamplingFmt("s16le");
std::string deviceName;
char c;
if (argc == 1) {
return 0;
}
// 程序参数解析
while ((c = getopt(argc, argv, "i:p")) != -1) {
switch (c) {
case 'p': // 修改监听端口号
port = atoi(optarg);
printf("port: %dn", port);
break;
case 'i': // 设置设备序号,设备名字使用QCameraInfo获取
index = atoi(optarg);
printf("index: %dn", port);
break;
}
}
if (-1 == index || index >= lists.size()) {
printf("please select device index: %dn", port);
exit(-1);
}
// 通过序号获取设备名字
deviceName = lists.at(index).deviceName().toStdString();
TaskScheduler* scheduler = BasicTaskScheduler::createNew();
UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);
// 创建rtsp服务器
RTSPServer* rtspServer = RTSPServer::createNew(*env, port);
if (rtspServer == nullptr) {
*env << "Failed to create RTSP server: " << env->getResultMsg() << "n";
return -1;
}
ServerMediaSession* sms;
sms = ServerMediaSession::createNew(*env, "live", "live rtsp server",
"live rtsp server");
if (!deviceName.empty())
sms->addSubsession(V4l2H264DevUnicastServerMediaSubsession::createNew(
*env, deviceName.c_str(), True, videoWidth, videoHeight, videoFps));
rtspServer->addServerMediaSession(sms);
char* url = rtspServer->rtspURL(sms);
*env << "Play this stream using the URL "" << url << ""n";
delete[] url;
env->taskScheduler().doEventLoop();
return 0;
}
服务器运行
-i 表示第几个设备,从0开始。
代码语言:javascript复制./RTSPServer -i 0
播放视频:
使用播放工具mplayer
安装播放工具:
代码语言:javascript复制sudo apt install mplayer
播放rtsp地址:
代码语言:javascript复制mplayer rtsp://127.0.1.1:8554/live
git传送门 (源码)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179805.html原文链接:https://javaforall.cn