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


    授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 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

    修改为以下内容:

    1. bindPort = 30000
    2. auth.method = "token"
    3. auth.token = "520101"
    4. webServer.addr = "0.0.0.0"
    5. webServer.port = 30001
    6. webServer.user = "admin"
    7. 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

    修改为以下内容:

    1. serverAddr = "54.229.195.3"
    2. serverPort = 30000
    3. auth.method = "token"
    4. auth.token = "520101"
    5. [[proxies]]
    6. name = "rtsp1"
    7. type = "tcp"
    8. localIP = "127.0.0.1"
    9. localPort = 8554
    10. 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

    运行:

    1. tar -zvxf mediamtx_v1.2.1_linux_amd64.tar.gz
    2. cd mediamtx
    3. ./mediamtx


    4. 本地ubuntu18部署 ffmpeg


    4.1 安装依赖


    4.1.1 编译依赖 

    1. sudo apt-get update -qq && sudo apt-get -y install \
    2.   autoconf \
    3.   automake \
    4.   build-essential \
    5.   cmake \
    6.   git-core \
    7.   libass-dev \
    8.   libfreetype6-dev \
    9.   libgnutls28-dev \
    10.   libmp3lame-dev \
    11.   libsdl2-dev \
    12.   libtool \
    13.   libva-dev \
    14.   libvdpau-dev \
    15.   libvorbis-dev \
    16.   libxcb1-dev \
    17.   libxcb-shm0-dev \
    18.   libxcb-xfixes0-dev \
    19.   meson \
    20.   ninja-build \
    21.   pkg-config \
    22.   texinfo \
    23.   wget \
    24.   yasm \
    25.   zlib1g-dev
    26.   


    4.1.2 插件依赖

    1. sudo apt-get install -y nasm && \
    2. sudo apt-get install -y libx264-dev && \
    3. sudo apt-get install -y libx265-dev libnuma-dev && \
    4. sudo apt-get install -y libvpx-dev && \
    5. sudo apt-get install -y libfdk-aac-dev && \
    6. 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版本”
    下载

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

    4.2.2 配置

    1. ./configure \
    2.   --prefix="$HOME/work/ffmpeg/install" \
    3.   --extra-libs="-lpthread -lm" \
    4.   --ld="g++" \
    5.   --enable-gpl \
    6.   --enable-gnutls \
    7.   --enable-libass \
    8.   --enable-libfdk-aac \
    9.   --enable-libfreetype \
    10.   --enable-libmp3lame \
    11.   --enable-libopus \
    12.   --enable-libvorbis \
    13.   --enable-libvpx \
    14.   --enable-libx264 \
    15.   --enable-libx265 \
    16.   --enable-nonfree

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


    4.3 编译

    make -j8


    4.4 安装

    make install


    4.5 测试


    4.5.1 ffmpeg推流


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

    gedit ~/.bashrc


     
    #在末尾添加 

    1. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxjianvm/work/ffmpeg/install/lib/
    2. 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

    解压

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


    5.2 安装依赖Required Packages

    1. # compiler ✓
    2. $ sudo apt-get install build-essential
    3. # required ✓
    4. $ sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
    5. # optional
    6. $ 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
    解决办法:

    1. sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
    2. 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 编译命令

    1. $ cd opencv-4.7.0/
    2. $ mkdir build && cd build/
    3. $ cmake   -DCMAKE_BUILD_TYPE=RELEASE \
    4. -DCMAKE_INSTALL_PREFIX=/home/xxjian/work/opencv/install/ \
    5. -DPYTHON_DEFAULT_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)")   \
    6. -DPYTHON3_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)")   \
    7. -DPYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print (numpy.get_include())") \
    8. -DPYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
    9. \
    10. -DBUILD_DOCS=OFF \
    11. -DBUILD_EXAMPLES=OFF \
    12. -DBUILD_TESTS=OFF \
    13. -DBUILD_PERF_TESTS=OFF \
    14. -DFFMPEG_DIR=/home/xxjianvm/work/ffmpeg/install \
    15. ..


    5.3.2 编译

    $ make -j8

    5.3.3 安装

    $ sudo make install

    5.4 验证

    1. $ python3
    2. import cv2
    3. cv2.__version__

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

    6.1 pyopencv_ffmpeg.py

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

    1. import cv2
    2. import subprocess
    3. import time
    4. import numpy as np
    5. '''拉流url地址,指定 从哪拉流'''
    6. # video_capture = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 自己摄像头
    7. pull_url = 'rtsp://127.0.0.1:8554/stream' # "rtsp_address"
    8. video_capture = cv2.VideoCapture(pull_url) # 调用摄像头的rtsp协议流
    9. # pull_url = "rtmp_address"
    10. '''推流url地址,指定 用opencv把各种处理后的流(视频帧) 推到 哪里'''
    11. push_url = "rtsp://127.0.0.1:8554/stream/ai"
    12. width = int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH))
    13. height = int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
    14. fps = int(video_capture.get(cv2.CAP_PROP_FPS)) # Error setting option framerate to value 0.
    15. print("width", width, "height", height, "fps:", fps)
    16. # command = [r'D:\Softwares\ffmpeg-5.1-full_build\bin\ffmpeg.exe', # windows要指定ffmpeg地址
    17. command = ['ffmpeg', # linux不用指定
    18. '-y', '-an',
    19. '-f', 'rawvideo',
    20. '-vcodec','rawvideo',
    21. '-pix_fmt', 'bgr24', #像素格式
    22. '-s', "{}x{}".format(width, height),
    23. '-r', str(fps), # 自己的摄像头的fps是0,若用自己的notebook摄像头,设置为152025都可。
    24. '-i', '-',
    25. '-c:v', 'libx264', # 视频编码方式
    26. '-pix_fmt', 'yuv420p',
    27. '-preset', 'ultrafast',
    28. '-f', 'rtsp', # flv rtsp
    29. '-rtsp_transport', 'tcp', # 使用TCP推流,linux中一定要有这行
    30. push_url] # rtsp rtmp
    31. pipe = subprocess.Popen(command, shell=False, stdin=subprocess.PIPE)
    32. def frame_handler(frame):
    33. kernel = np.ones((5,5),np.float32)/25
    34. dst = cv2.filter2D(frame,-1,kernel)
    35. return dst
    36. process_this_frame = True
    37. while True: # True or video_capture.isOpened():
    38. # Grab a single frame of video
    39. ret, frame = video_capture.read()
    40. # handle the video capture frame
    41. start = time.time()
    42. frame = frame_handler(frame)
    43. # Display the resulting image. linux 需要注释该行代码
    44. # cv2.imshow('Video', frame)
    45. # Hit 'q' on the keyboard to quit!
    46. if cv2.waitKey(delay=1) & 0xFF == ord('q'): # delay=100ms为0.1s .若dealy时间太长,比如1000ms,则无法成功推流!
    47. break
    48. pipe.stdin.write(frame.tostring())
    49. # pipe.stdin.write(frame.tobytes())
    50. video_capture.release()
    51. cv2.destroyAllWindows()
    52. pipe.terminate()

    6.2 运行测试

    python3 pyopencv_ffmpeg.py

     7. 观察效果

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

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

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

  • 相关阅读:
    内容长度不同的div如何自动对齐展示
    [论文][表情识别]Towards Semi-Supervised Deep Facial Expression Recognition with An Adaptive Confidence Margin
    基于RT1052与外设AT24C02的I2C通信demo
    9-4 查找星期 (15分)
    postman软件安装、实验应用
    HttpClient
    【LeetCode】674. 最长连续递增序列(简单)——代码随想录算法训练营Day52
    区块链国际会议汇总
    The Big Bang Theory
    uniapp实现我的订单页面无感 - 删除数据
  • 原文地址:https://blog.csdn.net/qq_27158179/article/details/134383587