『亚马逊云科技产品测评』活动征文|搭建带有“弱”图像处理功能的流媒体服务器

news2025/1/12 9:46:15

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。

本文基于以下软硬件工具:

+ aws ec2

+ frp-0.52.3

+ mediamtx-1.3.0

+ ffmpeg-5.1.4

+ opencv-4.7.0

0. 环境

aws ec2 一台
本地ubuntu18

本地win10 + 火狐浏览器

1. aws ec2准备


1.1 控制台

本步骤我们低成本创建服务器。

在控制台主页,地区选择 爱尔兰 eu-west-1

创建服务器
Search栏输入 -> EC2
-> 启动实例 -> 
-> Quick Start: Amazon Linux aws,
-> 实例类型:选择符合条件的免费套餐,t2.micro
-> 密钥对:创建密钥对
-> 名称:zzzzzzzzzzzzzzzzzzzz2#,RSA,.pem,然后保存到本地。ssh登录需要用到。
-> 创建实例

得到了服务器IP:54.229.195.3

1.2 连接到实例


1.2.1 控制台登录

点击实例ID:i-043213d6d1d2c8752
-> 点击 连接 -> 连接

1.2.2 ssh

用 MobaXterm为例
打开 MobaXterm -> Session -> SSH 
-> Remote host: 54.229.195.3
-> 勾选Specify username: ec2-user
-> Avanced SSH settings
-> 勾选 Use private key

1.3 部署frp测试

1.3.1 下载可执行文件


https://github.com/fatedier/frp/releases
下载

当前最新版本是0.52.3
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz


1.3.2 解压

tar -zvxf frp_0.52.3_linux_amd64.tar.gz

1.3.3 切换目录

cd frp_0.52.3_linux_amd64

1.3.4 修改配置

vim frps.toml

修改为以下内容:

bindPort = 30000
auth.method = "token"
auth.token = "520101"
webServer.addr = "0.0.0.0"
webServer.port = 30001
webServer.user = "admin"
webServer.password = "jian@123"

运行

./frps -c frps.toml &

1.3.5 服务器开启端口

通过web配置,开启自定义TCP,30000、30001、30002、30003

1.3.6 运行

./frps -c frps.ini &

1.3.7 测试web


浏览器打开 54.229.195.3:30001

登录信息:

admin

admin@123

2. 本地ubuntu18 部署 frp

2.1 下载可执行文件



https://github.com/fatedier/frp/releases
下载

当前最新版本是0.52.3
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz

2.2 解压

tar -zvxf frp_0.52.3_linux_amd64.tar.gz

2.3 切换目录

cd frp_0.52.3_linux_amd64

2.4 修改配置

vim frpc.ini

修改为以下内容:

serverAddr = "54.229.195.3"
serverPort = 30000

auth.method = "token" 
auth.token = "520101"

[[proxies]]
name = "rtsp1"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8554
remotePort = 30002


2.5 运行

./frpc -c frpc.toml &

3. 本地ubuntu18部署mediamtx


获取可执行文件
https://github.com/bluenviron/mediamtx/releases


下载得到了mediamtx_v1.2.1_linux_amd64.tar.gz

运行:

tar -zvxf mediamtx_v1.2.1_linux_amd64.tar.gz
cd mediamtx
./mediamtx


4. 本地ubuntu18部署 ffmpeg


4.1 安装依赖


4.1.1 编译依赖 


sudo apt-get update -qq && sudo apt-get -y install \
  autoconf \
  automake \
  build-essential \
  cmake \
  git-core \
  libass-dev \
  libfreetype6-dev \
  libgnutls28-dev \
  libmp3lame-dev \
  libsdl2-dev \
  libtool \
  libva-dev \
  libvdpau-dev \
  libvorbis-dev \
  libxcb1-dev \
  libxcb-shm0-dev \
  libxcb-xfixes0-dev \
  meson \
  ninja-build \
  pkg-config \
  texinfo \
  wget \
  yasm \
  zlib1g-dev
  


4.1.2 插件依赖

sudo apt-get install -y nasm && \
sudo apt-get install -y libx264-dev && \
sudo apt-get install -y libx265-dev libnuma-dev && \
sudo apt-get install -y libvpx-dev && \
sudo apt-get install -y libfdk-aac-dev && \
sudo apt-get install -y libopus-dev

4.2 编译


4.2.1 获取源码

https://ffmpeg.org/download.html#releases根据参考[3],得到“考虑到opencv4.7.0开始支持ffmpeg5.x版本,因此下载了ffmpeg 5.1版本”
下载

wget https://ffmpeg.org/releases/ffmpeg-5.1.4.tar.gz

tar -zvxf ffmpeg-5.1.4.tar.gz

4.2.2 配置

./configure \
  --prefix="$HOME/work/ffmpeg/install" \
  --extra-libs="-lpthread -lm" \
  --ld="g++" \
  --enable-gpl \
  --enable-gnutls \
  --enable-libass \
  --enable-libfdk-aac \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-libx264 \
  --enable-libx265 \
  --enable-nonfree

和官方编译教程对比,去掉了 libsvtav1 、libdav1d、libaom选项。


4.3 编译

make -j8


4.4 安装

make install


4.5 测试


4.5.1 ffmpeg推流


#设置环境变量 可以编译安装之后设置,也可以现在按照下方的路径规律,替换掉安装的根目录,主要是不是一步步的编译方式,所有这个过程不太严谨

gedit ~/.bashrc


 
#在末尾添加 

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxjianvm/work/ffmpeg/install/lib/
export PATH=$PATH:/home/xxjianvm/work/ffmpeg/install/bin/


#激活环境变量

source ~/.bashrc

下载测试视频

wget http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4

循环推流

ffmpeg -re -stream_loop -1 -i big_buck_bunny.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/stream

4.5.2 ffplay播放

ffplay rtsp://127.0.0.1:8554/stream

4.5.3 ffplay测试经过亚马逊的视频流

ffplay rtsp://54.229.195.3:30002/stream


5. opencv


5.1 准备源码


https://opencv.org/releases/
下载了
opencv-4.7.0.tar.gz

放在~/work/opencv

解压

cd ~/work/opencv
tar -zvxf opencv-4.7.0.tar.gz


5.2 安装依赖Required Packages


# compiler ✓
$ sudo apt-get install build-essential
# required ✓
$ sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
# optional ✓
$ sudo apt-get install python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

5.2.1 error : E: Unable to locate package libjasper-dev


问题:aliyun的ubuntu源找不到libjasper-dev
解决办法:

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update

#5.2.2 安装numpy(跳过)
#由于上面的python3-numpy是python3.6的,因此用pip3.7再安装一遍
#python3 -m pip install numpy
#
#$ sudo apt-get install -y libgstreamer-plugins-base1.0-dev \
#    libpng16-16 \
#        build-essential \
#        cmake \
#        git \
#        pkg-config \
#        libjpeg-dev \
#    libgtk2.0-dev \
#        libv4l-dev \
#        libatlas-base-dev \
#        gfortran \
#        libhdf5-dev \
#        libtiff5-dev \
#    libtbb-dev \
#    libeigen3-dev
    


5.3 编译安装


5.3.1 编译命令

$ cd opencv-4.7.0/
$ mkdir build && cd build/

$ cmake   -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/home/xxjian/work/opencv/install/ \
-DPYTHON_DEFAULT_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)")   \
-DPYTHON3_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)")   \
-DPYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print (numpy.get_include())") \
-DPYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
\
-DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_PERF_TESTS=OFF \
-DFFMPEG_DIR=/home/xxjianvm/work/ffmpeg/install \
..


5.3.2 编译

$ make -j8

5.3.3 安装

$ sudo make install

5.4 验证

$ python3
import cv2
cv2.__version__

6. 运行基于python-opencv的拉流处理再推流的脚本

6.1 pyopencv_ffmpeg.py

创建pyopencv_ffmpeg.py,添加以下内容:

import cv2
import subprocess
import time 
import numpy as np

'''拉流url地址,指定 从哪拉流'''
# video_capture = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 自己摄像头
pull_url = 'rtsp://127.0.0.1:8554/stream' # "rtsp_address"
video_capture = cv2.VideoCapture(pull_url) # 调用摄像头的rtsp协议流
# pull_url = "rtmp_address"


'''推流url地址,指定 用opencv把各种处理后的流(视频帧) 推到 哪里'''
push_url = "rtsp://127.0.0.1:8554/stream/ai"

width = int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(video_capture.get(cv2.CAP_PROP_FPS)) # Error setting option framerate to value 0. 
print("width", width, "height", height,  "fps:", fps) 


# command = [r'D:\Softwares\ffmpeg-5.1-full_build\bin\ffmpeg.exe', # windows要指定ffmpeg地址
command = ['ffmpeg', # linux不用指定
    '-y', '-an',
    '-f', 'rawvideo',
    '-vcodec','rawvideo',
    '-pix_fmt', 'bgr24', #像素格式
    '-s', "{}x{}".format(width, height),
    '-r', str(fps), # 自己的摄像头的fps是0,若用自己的notebook摄像头,设置为15、20、25都可。 
    '-i', '-',
    '-c:v', 'libx264',  # 视频编码方式
    '-pix_fmt', 'yuv420p',
    '-preset', 'ultrafast',
    '-f', 'rtsp', #  flv rtsp
    '-rtsp_transport', 'tcp',  # 使用TCP推流,linux中一定要有这行
    push_url] # rtsp rtmp  
pipe = subprocess.Popen(command, shell=False, stdin=subprocess.PIPE)

def frame_handler(frame):
    kernel = np.ones((5,5),np.float32)/25
    dst = cv2.filter2D(frame,-1,kernel)
    return dst


process_this_frame = True 
while True: # True or video_capture.isOpened():
    # Grab a single frame of video
    ret, frame = video_capture.read()

    # handle the video capture frame
    start = time.time()
    
    frame = frame_handler(frame) 
    
    # Display the resulting image. linux 需要注释该行代码
    # cv2.imshow('Video', frame)

    # Hit 'q' on the keyboard to quit!
    if cv2.waitKey(delay=1) & 0xFF == ord('q'): #  delay=100ms为0.1s .若dealy时间太长,比如1000ms,则无法成功推流!
        break
    
    pipe.stdin.write(frame.tostring())
    # pipe.stdin.write(frame.tobytes())
    
video_capture.release()
cv2.destroyAllWindows()
pipe.terminate()

6.2 运行测试

python3 pyopencv_ffmpeg.py

 7. 观察效果

创建两个控制台,分别输入以下指令:

ffplay rtsp://54.229.195.3:30002/stream

ffplay rtsp://54.229.195.3:30002/stream/ai

由于目前电脑处理能力比较弱,处理函数内添加太多操作,就会推流不成功,所以处理能力还有点弱。另外经过opencv的推流是没有声音的。

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

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

相关文章

链动2+1模式系统开发之区域代理深度解析

区域代理的保护机制:在链动商城系统里设定的代理有唯一性,每个省只有一个省代,每个市只有一个市代,每个区县只有一个区县代。这样也是保护每个代理的收益权益。 区域代理包含的权益类别:购物奖励折扣;区域实…

iOS群控手机App的开发难点是什么?

随着智能手机的普及,手机App已经成为我们生活中不可或缺的一部分,在众多手机操作系统中,iOS系统因其封闭性、安全性和流畅性而备受用户青睐,然而,开发一款针对iOS系统的手机App却并非易事。 一、开发语言与框架 iOS系…

Antv/G2 折线图 使用 DataSet 进行数据排序

DataSet 文档 G2 3.2 DataSet 文档 安装 浏览器引入 可以通过 <script> 标签引入在线资源或者本地脚本&#xff1a; <!-- 引入在线资源 --> <script src"https://unpkg.com/antv/data-set"></script><!-- 引入本地脚本 --> <sc…

解决pikachu中RCE中文乱码的问题

这个问题我在DVWA中的RCE栏目同样遇到过&#xff0c;今天在做pikachu的RCE的时候也遇到了&#xff0c;所以特此来解决一下这个问题&#xff0c;解决方法很简单&#xff0c;在源码中加入下一行代码。 $result iconv("GBK", "UTF-8", $result);加在68行前面…

虚拟仪器软件结构VISA

1、什么是VISA VISA是虚拟仪器软件结构(Virtual Instrument Software Architectuere)的简称&#xff0c;是由VXI plug & play系统联盟所统一制定的I/O接口软件标准及其相关规范的总称。一般称这个I/O函数库为VISA库&#xff08;用于仪器编程的标准I/O函数库&#xff09;。…

专业调色软件 3D LUT Creator Pro 激活中文 for mac

3D LUT Creator与彩 色 图 像一起工作的简单性和清晰度不会让任何人无动于衷。此外&#xff0c;扩展名为.3dl的文件可以导入到Adobe Photoshop&#xff0c;因此您可以将这些设置作为调整图层应用&#xff0c;不仅可以将它们应用于位图图像&#xff0c;还可以将其应用于矢量图形…

RT-DETR算法优化改进:一种新颖的动态稀疏注意力(BiLevelRoutingAttention) | CVPR2023

💡💡💡本文独家改进: 提出了一种新颖的动态稀疏注意力(BiLevelRoutingAttention),以实现更灵活的计算分配和内容感知,使其具备动态的查询感知稀疏性 1)代替RepC3进行使用; 2)BiLevelRoutingAttention直接作为注意力进行使用; 推荐指数:五星 RT-DETR魔术师专栏介…

分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测

分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测 目录 分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多…

通讯协议学习之路(实践部分):IIC开发实践

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 本文…

【JavaEE】Servlet(创建Maven、引入依赖、创建目录、编写及打包、部署和验证、smart Tomcat)

一、什么是Servlet&#xff1f; Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app 1.1 Servlet能干什么&#xff1f; &#x1f695;允许程序猿注册一个类, 在 Tomcat 收到某个特定的 HTTP 请求的时候, 执行这个类…

【Redis】Hash哈希类型

上一篇&#xff1a; set集合 https://blog.csdn.net/m0_67930426/article/details/134366814?spm1001.2014.3001.5502 目录 Hset Hget Hlen Hkeys Hvals Hincrby Hdecrby Hsetex Hsetnx 官网&#xff1a; https://redis.io/commands/?grouphash Hset 创建哈希集…

Facebook平台特征概述

Facebook是全球最大的社交媒体平台之一&#xff0c;拥有数十亿的用户。它的独特特征和功能使其成为人们分享、互动和连接的理想场所。下面小编将讲一下关于Facebook平台的特征的详细概述。 1、用户个人资料 每个Facebook用户都有一个个人资料页面&#xff0c;可以在上面分享个…

数据结构上机实验——图的实现(以无向邻接表为例)、图的深度优先搜索(DFS)、图的广度优先搜索(BFS)

文章目录 数据结构上机实验1.要求2.图的实现&#xff08;以无向邻接表为例&#xff09;2.1创建图2.1.1定义图的顶点、边及类定义2.1.2创建无向图和查找2.1.3插入边2.1.4打印函数 2.2图的深度优先搜索&#xff08;DFS&#xff09;2.3图的广度优先搜索&#xff08;BFS&#xff09…

RT-DETR算法优化改进:可变形大核注意力(D-LKA Attention),超越自注意力,实现暴力涨点 | 2023.8月最新发表

💡💡💡本文独家改进: 可变形大核注意力(D-LKA Attention),采用大卷积核来充分理解体积上下文的简化注意力机制,来灵活地扭曲采样网格,使模型能够适当地适应不同的数据模式 1)代替RepC3进行使用; 推荐指数:五星 RT-DETR魔术师专栏介绍: https://blog.csdn.n…

Java图像编程之:Graphics2D

一、介绍 1、Java图像编程的核心类 BufferedImage&#xff1a;用于表示图像的类&#xff0c;可以进行像素级的操作。Image&#xff1a;表示图像的抽象类&#xff0c;是所有图像类的基类。ImageIcon&#xff1a;用于显示图像的类&#xff0c;可以将图像嵌入到Swing组件中。Ima…

麒麟信安登录央视,深度展现为中国信息安全铸“魂”之路

麒麟信安登录央视&#xff0c;深度展现为中国信息安全铸“魂”之路 近日&#xff0c;麒麟信安登录央视频道&#xff0c;《麒麟信安——为中国信息安全铸“魂”》在CCTV-4中文国际频道、CCTV-7国防军事频道、CCTV-10 科教频道、CCTV-12社会与法频道、CCTV-17农业农村频道&#x…

RT-DETR算法优化改进:新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测 | NeurIPS2022

💡💡💡本文独家改进: 多尺度卷积注意力(MSCA),有效地提取上下文信息,新颖度高,创新十足。 1)代替RepC3进行使用; 2)MSCAAttention直接作为注意力进行使用; 推荐指数:五星 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12497375.ht…

【Docker】深入理解Docker:一种革新性的容器技术

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

Python实现WOA智能鲸鱼优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

Allegro层叠中的Etch Factor-铜皮的腐蚀因子如何计算

Allegro层叠中的Etch Factor-铜皮的腐蚀因子如何计算 在用Allegro进行PCB设计的时候,Cross-section中需要填入对应的信息,一般填入每层的厚度即可,如下图 当PCB需要进行仿真分析的时候,Etch-Factor这个值是必须要填写的,如下图 目前看到的都是90这个值,这是一个理论值。 …