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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Oracle 11g新特性虚拟列分区

    Oracle 11g新特性虚拟列分区

    2022年1月28日
    37
  • 负载均衡的算法有哪些_流量负载均衡

    负载均衡的算法有哪些_流量负载均衡G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。如何用最少搬运量可以使 n 个仓库的库存数量相同。搬运货物时,只能在相邻的仓库之间搬运。数据保证一定有解。输入格式第 1 行中有 1 个正整数 n,表示有 n 个仓库。第 2 行中有 n 个正整数,表示 n 个仓库的库存量。输出格式输出最少搬运量。数据范围1≤n≤100,每个仓库的库存量不超过 100。输入样例:517 9 14 16 4输出样例:11#include<bits/stdc++.

    2022年8月11日
    3
  • 6.Page对象详解

    6.Page对象详解序就好像用户看到的都是由dom表现出来的,所有的业务处理都是在Page对象中处理的。如果业务越简单,创建的Page对象数量就会越少;如果业务越复杂,那么相对而言Page对象数量就越多(或Page实例对象就会越复杂)。Page对象主要做以下事情:渲染页面,保证dom元素的合理安排,以及事件的处理;数据交互,将数据正确的放在dom元素中,并进行合理的前后端数据交互。无论是在哪个时候,这两点确实是前端开发的重中之重,换一句话说这就是前端核心开发内容。为了让Page对象更加专注于上面所提的两件事情,

    2022年7月11日
    20
  • sqlserver怎么用语句创建表_mysql查询表的创建语句

    sqlserver怎么用语句创建表_mysql查询表的创建语句原文地址:http://database.51cto.com/art/201010/231018.htmSQLServer创建表是最常见也是最常用的操作之一,下面就为您介绍SQLServer创建表的语句写法,供您参考,希望可以让您对SQLServer创建表方面有更深的认识。USE suntest create table 仓库 ( 仓库编号 int ,  仓库

    2022年10月17日
    3
  • 白话经典算法系列之六 高速排序 高速搞定

    白话经典算法系列之六 高速排序 高速搞定

    2021年9月4日
    40
  • throw 和 throws 的区别?

    throw 和 throws 的区别?throw和throws的区别?throw:表示方法内抛出某种异常对象 如果异常对象是非RuntimeException则需要在方法申明时加上该异常的抛出即需要加上throws语句或者在方法体内trycatch处理该异常,否则编译报错 执行到throw语句则后面的语句块不再执行throws:方法的定义上使用throws表示这个方法可能抛出某种…

    2025年8月7日
    6

发表回复

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

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