QT 实现 RTSP 视频流服务器[通俗易懂]

QT 实现 RTSP 视频流服务器[通俗易懂]uos操作系统中使用QT开发RTSP视频流服务器,以下的实现方式使用的是单播方式。可以通过自己开发的rtsp服务器将摄像头的数据推送到服务器中,其他用户可以通过访问视频流地址,直接访问摄像头的内容,也就是通常说的摄像头直播。本篇文章使用开源框架live555开发一个属于自己的视频流服务器。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

uos操作系统中使用QT开发RTSP 视频流服务器,以下的实现方式使用的是单播方式,除了单播模式还有多播模式。 

可以通过自己开发的rtsp服务器将摄像头的数据时时推送到服务器中,其他用户可以通过访问视频流地址rtsp://127.0.1.1:8554/live,直接访问摄像头播放的内容,也就是通常说的摄像头直播。本篇文章使用开源框架live555开发一个属于自己的视频流服务器。

安装环境依赖

live555的使用需要较多的环境依赖,一下安装都是编译依赖相关内容。

由于只是一个小demo,因此没有做成debian的依赖关系,不过我们可以通过以下命令安装。

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环境版本说明。

QT 实现 RTSP 视频流服务器[通俗易懂]

操作系统:统信uos操作系统

编码

#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: %d\n", port);
                break;

            case 'i':    // 设置设备序号,设备名字使用QCameraInfo获取
                index = atoi(optarg);
                printf("index: %d\n", port);
                break;
        }
    }
    if (-1 == index || index >= lists.size()) {
        printf("please select device index: %d\n", 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开始。

./RTSPServer -i 0

播放视频:

使用播放工具mplayer

安装播放工具:

sudo apt install mplayer

播放rtsp地址:

mplayer rtsp://127.0.1.1:8554/live

git传送门 (源码)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179805.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 下载安装cygwin_ansys17安装教程详细

    下载安装cygwin_ansys17安装教程详细windows下安装cygwin软件详细过程

    2025年6月18日
    5
  • java cloneable 用途_java中cloneable的使用「建议收藏」

    java cloneable 用途_java中cloneable的使用「建议收藏」什么是java中的浅克隆和深克隆?浅克隆:克隆对象中的变量与之前对象的值相同,并且对象中的引用类型变量仍然指向原来对象引用类型变量的地址.深克隆:克隆对象中的变量与之前对象的值相同,并且对象中的引用类型变量指向了新的对象的引用变量的地址.要想实现克隆,只需定义的类声明下cloneable这个标记性接口,并且衍生重写Object类中就有的clone()方法即可.为什么类要首先声明cloneable标…

    2022年10月14日
    4
  • labelme标注的数据分析[通俗易懂]

    labelme标注的数据分析[通俗易懂]参考:github地址:https://github.com/wkentaro/labelme安装安装方式:详情参考官网安装#Ubuntu14.04sudoapt-getinstallpython-qt4pyqt4-dev-toolssudopipinstalllabelme#python2works#Ubuntu16.04sudoapt-getinsta

    2025年10月29日
    3
  • React 路由跳转后回到页面顶部

    React 路由跳转后回到页面顶部

    2021年5月28日
    526
  • pytest测试框架和unittest_python列表生成式

    pytest测试框架和unittest_python列表生成式一、核心要素(1)TestCase测试用例一个.py脚本就是一个测试用例测试用例类必须继承于unittest.TestCase类中的方法名必须以test开头,否则不会被执行类的外部写main方法(自测代码)(2)TestSuite测试套件测试套件就是测试用例的集合把多个测试用例集合到一起就构成了测试套件测试套件不能直接执行(3)TextTestR…

    2022年10月14日
    3
  • KAZE 特征笔记

    KAZE 特征笔记KAZE特征主要通过非线性扩散滤波器建立非线性尺度空间,而非线性扩散的解决方案则是通过AOS方案解决的,特征的检测与SIFT特征检测相似,都是查找局部极值再亚像素化精确定位,而特征的描述子则是所使用M-SUFR描述子

    2022年6月15日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号