福州大学《嵌入式系统综合设计》实验十三:RTSP拉流与RTMP推流

news2024/12/23 13:48:15

 一、实验目的

掌握基于算能平台的JPEG压缩编码方法以及开发环境,包括开发主机环境搭建,硬件嵌入式开发板的连接,云平台的配置,编码程序的编译、运行等。

二、实验内容

搭建实验开发环境,并编写静止图像jpeg格式编解码程序,输入端读取原始图像数据,选择编解码模式,输出压缩编码结果。在目标开发机运行测试,验证开发环境。如果是基于云平台虚拟环境,则需要将编译好的程序代码上传云平台进行测试运行。

三、开发环境

开发主机:Ubuntu 20.04.6 LTS

硬件:算能SE5

四、实验器材

开发主机 + 云平台(或SE5硬件)

五、实验过程与结果

参考例程

本实验可以参考git上的ocv_video_xcode.cpp例程完成。

实验内容与步骤

图1 连接部署图

如上图所示,本实验利用OpenCV接口,在SE5上实现通过RTSP拉流,然后通过RTMP将码流推送给PC/服务器。在实现过程中,RTSP拉流和RTMP推流分别在不同的线程中实现。并且,RTSP拉流的过程中会进行解码,在RTMP推流的过程中会进行编码操作。

本实验中的摄像头也可以直接通过PC机一起完成,可以在PC机上安装并启动RTSP Server。

推荐使用EasyDarwin安装RTSP Server:https://www.easydarwin.org/

也可以直接在SE5上安装,则需要下载源码并进行编译后在SE5上进行安装。PC上可以安装Nginx作为RTMP服务器。

Windows下Nginx服务器的安装和RTMP服务器开启方法见附件描述。

本实验两个线程的操作流程如下图:

在上述处理流程中,在主线程中只需要将open的文件名设置为RTSP地址即可实现对视频流的拉取,然后将读取后的视频帧(解码后的视频帧)存入视频缓存队列,在写线程中将write的文件名设置为RTMP即可实现将视频流推送到指定地址。

在OpenCV中分别提供了VideoCapture类和VideoWriter类用于视频文件的读和写操作。下面介绍具体的编程实现过程。

主线程函数

OpenCV获取视频流

如前所述,OpenCV通过VideoCapture类实现对URL地址进行读取,并进行解码。这部分相关的代码也可以参考实例11来实现,其关键代码如下:

//初始化VideoCapture类
VideoCapture cap;
//打开文件或者摄像头或者某个RTSP连接
cap.open(threadPara->inputUrl, CAP_FFMPEG, threadPara->deviceId);
...
//读取视频帧存入image中
Mat image;
cap.read(image); 

代码中的threadPara->inputUrl即为输入的RTSP视频流地址。threadPara->deviceId为板卡ID,如果是SOC模式,则为0,如果是PCIE模式需要指定具体的板卡ID。

 视频帧存入视频缓存队列

主线程通过cap.read(image)获取到image后,存入视频缓存队列。本实验中涉及两个不同的线程对缓存队列进行读写操作,为保障线程同步,需要通过上锁和解锁对缓存队列进行保护:

g_video_lock.lock();
//存入缓存队列
threadPara->imageQueue->push(image);
g_video_lock.unlock();

上述代码中获取到的MAT格式的image就是解码后的视频帧数据。

写线程函数

OpenCV推送视频流

OpenCV提供了写入视频的接口类VideoWriter,VideoWriter是向文件中以指定的编码格式将每一帧图片写入到视频中。可以直接通过VideoWriter类对URL地址进行推流:

VideoWriter  writer;       //创建VideoWriter类  
//outfile输出视频文件的路径名称
//fourcc: 字符类型的编码,表示用于编码视频文件的编码器,比如采用HEVC编码
writer.open(outfile, VideoWriter::fourcc('h', 'v', 'c', '1'),
        threadPara->fps,             //帧率
        Size(threadPara->imageCols, threadPara->imageRows),
        encodeparms,
        true,
        threadPara->deviceId);
writer.write(*toEncImage); //通过write接口推送

fourcc接口还可以设置不同的编码方式比如:

VideoWriter::fourcc('P','I','M','1') //表示MPEG-1 编码文件扩展名为avi; VideoWriter::fourcc('X','V','I','D') //表示MPEG-4编码文件扩展名为avi; VideoWriter::fourcc('X','2','6','4') //表示MPEG-4编码文件扩展名为mp4;
VideoWriter::fourcc('I','4','2','0') //表示YUV编码,文件扩展名为avi;
VideoWriter::fourcc('M','P','4','V') //表示旧的MPEG-4编码,文件扩展名为avi;
VideoWriter::fourcc('T','H','E','O') //表示使用ogg vorbis,文件扩展名为ogv;
VideoWriter::fourcc('F','L','V','1') //表示flash video,文件扩展名为flv;

本实验中的RTSP服务器端可以直接通过摄像头进行拉流,也可以通过在PC机上安装RTSP服务器来完成。本实验中的RTMP服务器可以通过安装Nginx服务器来完成。安装Nginx的流程如下:

Windows下Nginx服务器的安装与RTMP使用

Nginx官网:nginx news  ,然后点击“download”

  

选择最新版本或稳定版本

  

 解压Nginx,进入CMD,进到目录后并运行start nginx或者ngnix.exe。

进入conf文件夹,打开nginx.conf文件,增加配置如下:

worker_processes  1;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;
        chunk_size 4000;
        application live {
             live on;
             allow publish 127.0.0.1;
             allow play all;
        }
    }
}

配置HTTP

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
 
    server {
        listen       80;
        server_name  localhost;
        
        #location / {
        #   root   html;
        #    index  index.html index.htm;
        #}
        
        # Serve HLS fragments
        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
        root /tmp;
            add_header Cache-Control no-cache;
        }

        # Serve DASH fragments
        location /dash {
            root /tmp;
            add_header Cache-Control no-cache;
        }
 
        location /live_hls {
            types{
                #m3u8 type设置
                application/vnd.apple.mpegurl m3u8;
                #ts分片文件设置
                video/mp2t ts;
            }
            #指向访问m3u8文件目录
            alias ./m3u8File;
                add_header Cache-Control no-cache; #禁止缓存
        }
        
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl{
            root ./nginx-rtmp-module;
        }
 
        location /control {
            rtmp_control all;
        }
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

 验证nginx配置文件

cd nginx所在目录
nginx -t

启动nginx

cd nginx所在目录
start nginx
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

验证nginx

在浏览器输入:http://localhost/,查看nginx是否启动 

在浏览器输入:http://localhost/stat,查看媒体流服务的情况

VLC拉流

安装VLC播放器,并打开软件。

左上角媒体→打开网络串流→网络,配置URL(格式形如:rtmp://ip:port/live)

rtmp://127.0.0.1:1935/live

点击播放,验证是否成功拉到了流。

Wireshark安装与使用

Wireshark下载安装

下载地址:Wireshark · Go Deep

根据自己的操作系统选择对应的版本:

打开Wireshark,并选择监听的网卡

也可以选择:

然后选择自己对应的网卡:

进入抓包

设置过滤

ip.addr == 192.0.2.1   //设置仅捕获IP地址为192.0.2.1的报文 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1275797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Python中对Dynamsoft Barcode Reader性能进行基准测试

Dynamsoft Barcode Reader SDK一款多功能的条码读取控件,只需要几行代码就可以将条码读取功能嵌入到Web或桌面应用程序。这可以节省数月的开发时间和成本。能支持多种图像文件格式以及从摄像机或扫描仪获取的DIB格式。使用Dynamsoft Barcode Reader SDK,…

ThinkPHP 2.x任意代码执行漏洞

任务一: 复现环境中的代码漏洞 任务二: 尝试利用代码执行漏洞读取服务器web目录下的文件列表。 任务一: 1.搭建环境: 2.在php环境下直接输入{${phpinfo}}测试代码片段 2.写入一句话木马,用antsword连接&#xff0…

Java数据结构之《循环队列》题目

一、前言: 这是怀化学院的:Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完…

夯实c基础

夯实c基础 区别: 图一的交换,(交换的是地址而不是两数)无法实现两数的交换。 题干以下程序的输出结果为( c  )。 void fun(int a, int b, int c){ ca*b; } void main( ){ int…

【Unity】Blender场景导入

素材 下载场景:https://www.aplaybox.com/details/model/keDSIks72Qh3 blender文件导出为.fbx文件,路径选择复制(做的过程太乱了不知道有没有影响),物理类型选择网格,勾选应用变换 blender下的物体长度是u…

openbabel 安装 生成指纹方法

今日踩坑小结: openbabel 安装: 可以装,但是得在 Linux 环境下,win 环境装会报错(安装不会报错,但是生成指纹的时候会) 指纹: 在下面这个链接里,官方给出了命令行调用 o…

袖珍可穿戴手持气象仪是什么?

随着科技的不断发展,我们身边的世界正在变得越来越智能化。近日,一款名为WX-SQ12可穿戴手持气象仪的科技新品引起了人们的广泛关注。这款气象仪不仅具有创新性的可穿戴设计,还具备强大的气象数据监测功能,让用户可以随时掌握天气变…

nvm安装管理nodejs版本

1:如果之前先安装了nodejs先卸载nodejs 2:下载nvm,点击下载路径https://github.com/coreybutler/nvm-windows/releases,选择相应环境下载,如下window环境下载 下载成功后,选择NVM安装在哪个文件目录下&…

【图论】重庆大学图论与应用课程期末复习资料2-各章考点(计算部分)(私人复习资料)

图论各章考点 二、树1、避圈法(克鲁斯克尔算法)2、破圈法3、Prim算法 四、路径算法1、Dijkstra算法2、Floyd算法 五、匹配1、匈牙利算法(最大权理想匹配(最小权权值取反)) 六、行遍性问题1、Fleury算法&…

从 Oracle 到 TiDB,全链路数据迁移平台核心能力和杭州银行迁移实践

作者:邵健 杭州银行数据库专家 王辉 PingCAP 杭州银行在 TMS beta 阶段就进行了深度的测试体验,在过程中提供了大量的宝贵建议,帮助 TMS 进行了快速的优化和迭代。近期杭州银行借助 TMS 进行了多次 Oracle 生产数据库的迁移实践,…

双远心镜头:让视觉检测更精准、高效!

工业镜头是视觉系统中的重要组件,工业镜头的选型影响着整个系统的成像效果。在做视觉检测时,会遇到无法检测空间物体、无法控制视场变化、无法控制图像扭曲、对比度低、畸变大、反光等问题,这时普通的工业镜头并不能有效地解决问题&#xff0…

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用系统目录文件处理工具

文章目录 1️⃣ TypeScript操作电脑目录和文件1.1 获取磁盘信息1.2 获取目录下所有文件夹和文件1.3 新建文件夹1.4 新建文本1.5 重命名1.6 删除文件夹1.7 删除文件1.8 打开系统文件或系统文件夹1.9 根据字节转换文件大小带单位 优质资源分享 作者:xcLeigh 文章地址&…

JOSEF约瑟 剩余电流保护器 CLJ3-100A+LH30 导轨安装

CLJ3系列剩余电流动作继电器 系列型号: CLJ3-100A剩余电流动作继电器 CLJ3-250A剩余电流动作继电器 CLJ3-400A剩余电流动作继电器 CLJ3-630A剩余电流动作继电器 LH30剩余电流互感器 LH80剩余电流互感器 LH100剩余电流互感器 LH140剩余电流互感器 一、产品概…

Linux5-计划任务、进程

计划任务 一、cron 计划任务 周期性计划任务 cron 任务概述 • 用途:按照设置的时间间隔为用户反复执行某一项固定的系统任务 • 软件包:cronie、crontabs • 系统服务:crond • 日志文件:/var/log/crond 管理计划任务策略 • 使用 cro…

Leetcode—1657.确定两个字符串是否接近【中等】

2023每日刷题(四十五) Leetcode—1657.确定两个字符串是否接近 算法思想 源于灵神 实现代码 class Solution { public:bool closeStrings(string word1, string word2) {int len1 word1.size();int len2 word2.size();if(len1 ! len2) {return fa…

【note: This is an issue with the package mentioned above, not pip.】

安装gym时出现问题,note: This is an issue with the package mentioned above, not pip. 报错原因: 缺失了某些依赖模块,所以安装报错。 Collecting package metadata (current_repodata.json): done Solving environment: failed with in…

阿里云新版公共实例从注册账号到创建设备生成参数教程

1 注册阿里云 打开阿里云官网,点击右上角的登录/注册 打开的界面按照图片输入手机号注册 注册成功后,登录返回第一次打开的界面,点击控制台 点击控制台后界面如下 点击左上角的菜单,弹出新窗口,搜索物联网平台 开通物…

分治算法——75. 颜色分类

文章目录 🌿0. 分治🌻1. 题目🌼2. 算法原理🌴3. 代码实现 🌿0. 分治 分治分治,顾名思义分而治之,将一个大问题转换成若干个子问题,再将这些子问题的基础上继续划分成更小的子问题&a…

springboot+java校园自助洗衣机预约系统的分析与设计ssm+jsp

洗衣服是每个人都必须做的事情,而洗衣机更成为了人们常见的电器,但是单个洗衣机价格不菲,如果每人都买,就会造成资源的冗余。所有就出现了公用设备,随着时代的发展,很多公用都开始向着无人看守的自助模式经…

centOS使用docker部署ElasticSearch和Kibana

一、docker部署ElasticSearch 1、创建网桥 docker network create xybnet 2、下载镜像 docker pull elasticsearch:8.2.0 3、先运行容器 docker run -d \ --name es \ --net xybnet \ -p 9200:9200 \ -p 9300:9300 \ -p 5601:5601 \ -e "discovery.typesing…