• RTSP协议学习Ubuntu环境准备


    RTSP协议学习Ubuntu环境准备

    RTSP协议概述

    实时流传输协议(RTSP:Real Time Streaming Protocol)是⼀种网络传输协议,旨在发送低延迟流。该协议由RealNetworks,Netscape和哥伦⽐亚⼤学的专家在1996年开发。它定义了应如何打包流中的数据以进行传输。
    在这里插入图片描述
    其实上,RTP协议也是应用层的,这里只是逻辑上划到了传输层。

    Ubuntu环境准备

    一、Ubuntu安装FFmpeg

    下载FFmpeg 4.4.3源码到Ubuntu

    1. cd 到下载的ffmpeg文件执行命令,生成编译脚本;

      解压

          tar -zxvf ffmpeg-4.4.3.tar.gz
          cd ffmpeg-4.4.3
      
      • 1
      • 2

      生成makefile脚本

       ./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --enable-libx264 --enable-gpl  --enable-shared
      
      • 1
      • prefix可以指定安装的本地电脑的路径
      • enable-debug表示可以允许在开发时调试
      • disable-static关闭静态库
      • enable-shared 打开动态库,这个enable-shared 要写在最后面,不然会报错。比如你可能把libfdk_aac编码器加进去,就把–enable-libfdk-aac写在shared的前面;
    • 这里用到的x264要提前安装sudo apt-get install libx264-dev
    1. 指定多个进程进行编译

      make -j 4 
      
      • 1

      指定多个进程进行编译,加快编译速度,如果电脑是单核的设置多少都是一样的;

    2. 安装

      sudo make install 
      
      • 1

      加sudo是因为安装的目录地址可能有读写权限问题

      如果直接ffmpeg -v会发现找不到命令,还要进行如下操作。

    3. 设置链接

      ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/bin/ffmpeg
      ln -s /usr/local/ffmpeg/bin/ffprobe /usr/bin/ffprobe
      ln -s /usr/local/ffmpeg/bin/ffplay /usr/bin/ffplay
      
      • 1
      • 2
      • 3
    4. 添加库路径

      sudo touch /etc/ld.so.conf.d/ffmpeg.conf #在其中添加路径:/usr/local/ffmpeg/lib

    5. 链接

       sudo ldconfig 
      
      • 1

      ffmpeg -v查看安装情况

      ldconfig命令的用途:主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。

    二、安装ZLMediaKit

    1、获取代码

    请不要使用 github 下载 zip 包的方式下载源码,务必使用 git 克隆 ZLMediaKit 的代码,因为 ZLMediaKit 依赖于第三方代码,zip 包不会下载第三方依赖源码,你可以这样操作:

    #国内用户推荐从同步镜像网站gitee下载 
    git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
    cd ZLMediaKit
    #千万不要忘记执行这句命令
    git submodule update --init
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、强烈推荐

    如果你是位新手,强烈建议使用 ubuntu16 或更新版本编译 ZLMediaKit,macOS 是次选推荐平台,最不推荐的是 centos6.* 或 windows 平台。

    3、编译器

    3.1、编译器版本要求

    ZLMediaKit 采用了 C++11 的语法和库,要求编译器支持完整的 C++11 标准,亦即:

    • linux 上要求 gcc 版本 >= 4.8(4.7 应该也能支持)
    • macOS 上 clang >= ???(我也不知道,估计大部分不会遇到这个问题)
    • windows 上 visual stuido >= 2015(vs2013 某些版本也能编译通过,如果怕麻烦建议直接 vs2017)

    3.2、安装编译器

    • 如果你是 debian 系操作系统 (包括 ubuntu 系用户),一般自带的 gcc 版本够新,你可以这样安装 gcc 编译器:

      sudo apt-get install build-essential
      
      • 1
    • 如果你是 centos7 或以上用户,你可以这样安装 gcc 编译器:

      sudo yum -y install gcc
      sudo yum -y install gcc-c++
      
      • 1
      • 2
    • 如果你是 centos6.* 用户,你可以这样安装 gcc 编译器:

      sudo yum install centos-release-scl -y
      sudo yum install devtoolset-4-toolchain -y
      #切换到高版本gcc
      scl enable devtoolset-4 bash
      
      • 1
      • 2
      • 3
      • 4
    • 如果你是 macOS 用户,你直接安装 xcode 即可。

    • 如果你是 windows 用户,推荐安装 vs2017 或以上。

    4、cmake

    ZLMediaKit 采用 cmake 来构建项目,通过 cmake 才能生成 Makefile(或 Xcode/VS 工程),所以必须先安装 cmake 才能完成后续步骤。

    • 如果你是 debian 系操作系统 (包括 ubuntu 系用户),一般自带的 cmake 版本够新,你可以这样安装 cmake

      sudo apt-get install cmake
      
      • 1
    • 如果你是 centos7 或以上用户,你也许可以这样安装 cmake:

      sudo yum -y install cmake
      
      • 1
    • 如果你是 centos6.* 用户,那么你需要下载新版本的 cmake 源码然后编译安装 cmake

      wget https://github.com/Kitware/CMake/releases/download/v3.17.0-rc3/cmake-3.17.0-rc3.tar.gz
      tar -xvf cmake-3.17.0-rc3.tar.gz
      cd cmake-3.17.0-rc3
      ./configure
      make -j4
      sudo make install
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 如果你是 macOS 用户,你可以这样安装 cmake:

    • 如果你是 windows 用户,并且 vs 版本为 2017 及以上,你不用单独安装 cmake,否则你需要安装 cmake-gui:

      #安装win64版本cmake
      https://github.com/Kitware/CMake/releases/download/v3.17.0-rc3/cmake-3.17.0-rc3-win64-x64.zip
      
      #安装win32版本cmake
      https://github.com/Kitware/CMake/releases/download/v3.17.0-rc3/cmake-3.17.0-rc3-win32-x86.zip
      
      • 1
      • 2
      • 3
      • 4
      • 5

    5、依赖库

    5.1、依赖库列表

    ZLMediaKit 可选依赖一些第三方库,这些库都不是必选的;在构建 ZLMediaKit 时,cmake 能查找系统路径中的这些库,并根据安装情况选择是否开启相关特性,你可以选择安装这些依赖并启用相关特性:

    • openssl

      • flash player 在播放 rtmp 时,采用的是复杂握手模式,如果不安装该库,flash player 将播放不了 zlmediakit 提供的 rtmp url.

      • 同时 ZLMediaKit 的 https/rtsps/webrtc 相关功能需要使用 openssl 才能开启。

    • ffmpeg

      zlmediakit 可以通过 fork ffmpeg 进程的方式实现多种协议的拉流,编译时不需要安装 FFmpeg。

    • sdl、avcodec、avutil

      这 3 个库供 ZLMediaKit 的 test_player 测试程序使用,你通常不需要安装这 3 个库。

    5.2、安装依赖库

    • Debian 系 (包括 ubuntu)系统下安装依赖的方法:

      #除了openssl,其他其实都可以不安装
      sudo apt-get install libssl-dev
      sudo apt-get install libsdl-dev
      sudo apt-get install libavcodec-dev
      sudo apt-get install libavutil-dev
      sudo apt-get install ffmpeg
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • centos6.* 的用户可以参考该文章

    • macOS/centos 下安装依赖库:

      基本安装方式跟 Debian 系安装差不多,安装命令分别改成 brew / yum 即可。但是有些库名字与 Debian 系不太一样,请自行查找相关资料。

    • windows 下安装依赖库

      • 安装 openssl

        请从网站中下载。

    6、构建和编译项目

    由于开启 webrtc 相关功能比较复杂,默认是不开启编译的,如果你对 zlmediakit 的 webrtc 功能比较感兴趣,可以参考这里

    • 在 linux 或 macOS 系统下, 你应该这样操作:

      cd ZLMediaKit
      mkdir build
      cd build
      #macOS下可能需要这样指定openss路径:cmake .. -DOPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2j/
      cmake ..
      make -j4
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 在 windows 系统下

      • 如果你是 vs2017 或以上,可以在 vs 菜单栏中直接打开项目文件夹:

        [文件] -> [打开] -> [文件夹] -> [选择ZLMediaKit代码根目录并打开]
        
        • 1

      • 如果你是 vs2017 以下版本,你需要使用 cmake-gui 生成 vs 工程然后编译:

        1 进入ZLMediaKit目录执行 git submodule update --init 以下载ZLToolKit的代码
        2 使用cmake-gui打开工程并生成vs工程文件.
        3 找到工程文件(ZLMediaKit.sln),双击用vs2017打开.
        4 选择编译Release 版本.
        5 找到目标文件并运行测试用例.
        
        • 1
        • 2
        • 3
        • 4
        • 5
      • 同时,Windows 编译也可以参考这里

    • 如果你要编译 Android 版本,你可以自己在 Android Studio 中打开 Android 目录。

    • 如果你要编译 ios 版本,可以生成 xcode 工程然后编译 c api 的静态库; 另外,你可以参考此文档

      cd ZLMediaKit
      mkdir -p build
      cd build
      # 生成Xcode工程,工程文件在build目录下
      cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../cmake/ios.toolchain.cmake  -DPLATFORM=OS64COMBINED
      
      • 1
      • 2
      • 3
      • 4
      • 5

    7、运行

    ZLMediaKit 工程主要生成 3 种二进制目标文件,他们的生成的路径在 release 目录下,这些目标文件主要分为:

    • MediaServer 进程

      这是 ZLMediaKit 作为服务器的主进程,该进程可以在免去开发的情况下直接作为测试流媒体服务器使用,如果你需要更复杂的业务逻辑,可以通过 Web HOOKRESTful API 实现, 同时你可以通过配置文件控制其参数。

      • 在 linux 下启动:

        cd ZLMediaKit/release/linux/Debug
        #通过-h可以了解启动参数
        ./MediaServer -h
        #以守护进程模式启动
        ./MediaServer -d &
        
        • 1
        • 2
        • 3
        • 4
        • 5

        -h查看启动参数

        $ ./MediaServer -h
         -h  --help     无参  默认:null                                                                选填  打印此信息
          -d  --daemon   无参  默认:null                                                                选填  是否以Daemon方式启动
          -l  --level    有参  默认:0                                                                   选填  日志等级,LTrace~LError(0~4)
          -m  --max_day  有参  默认:7                                                                   选填  日志最多保存天数
          -c  --config   有参  默认: config.ini   选填  配置文件路径
          -s  --ssl      有参  默认: default.pem  选填  ssl证书文件或文件夹,支持p12/pem类型
          -t  --threads  有参  默认:4                                                                   选填  启动事件触发线程数
          -v  --version  无参  默认:null                                                                选填  显示版本号
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9

        不加&为前台启动,如

        $ sudo ./MediaServer -d -c ./config.ini
        
        2771-MediaServer System.cpp:122 startDaemon | 启动子进程:2774
        2774-MediaServer System.cpp:154 systemSetup | core文件大小设置为:18446744073709551615
        2774-MediaServer System.cpp:163 systemSetup | 文件最大描述符个数设置为:1048576
        2774-MediaServer SSLBox.cpp:174 setContext | add certificate of: default.zlmediakit.com
        2774-stamp thread util.cpp:366 operator() | Stamp thread started!
        2774-MediaServer EventPoller.cpp:461 EventPollerPool | 创建EventPoller个数:4
        2774-MediaServer TcpServer.cpp:199 start_l | TCP Server listening on [::]:554
        2774-MediaServer TcpServer.cpp:199 start_l | TCP Server listening on [::]:1935
        2774-MediaServer TcpServer.cpp:199 start_l | TCP Server listening on [::]:80
        2774-MediaServer TcpServer.cpp:199 start_l | TCP Server listening on [::]:443
        2774-MediaServer TcpServer.cpp:199 start_l | TCP Server listening on [::]:10000
        2774-MediaServer UdpServer.cpp:104 start_l | UDP Server bind to [::]:10000
        2774-MediaServer UdpServer.cpp:104 start_l | UDP Server bind to [::]:9000
        2774-MediaServer main.cpp:358 start_main | 已启动http api 接口
        2774-MediaServer main.cpp:360 start_main | 已启动http hook 接口
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
      • 在 macos 下启动:

        目标文件目录在 ZLMediaKit/mac/Debug, 其他操作完全一致。

      • 在 window 下启动:

        1 进入ZLMediaKit/release/windows/Debug目录
        2 双击MediaServer启动
        3 你也可以在cmd或powershell中启动,通过MediaServer -h了解启动参数
        
        • 1
        • 2
        • 3
      • c api 的 SDK

        ZLMediaKit 也提供 c 的 api 二次开发 sdk 库,头文件在ZLMediaKit/api/include, 库文件为:

      • linux 下:

        ZLMediaKit/release/linux/Debug/libmk_api.so
        
        
        • 1
        • 2
      • macOS 下:

        ZLMediaKit/release/linux/mac/libmk_api.dylib
        
        
        • 1
        • 2
      • windows 下:

        ZLMediaKit/release/windows/Debug/mk_api.dll
        ZLMediaKit/release/windows/Debug/mk_api.lib
        
        • 1
        • 2

        SDK 头文件有详细的注释,一般足够二次开发使用。

    • test_开头的测试程序

      相关代码在ZLMediaKit/tests目录下,你可以对照代码启动测试进程。

    8、测试

    请参考此文章完成推流播放测试

    三、测试

    推流测试

    ZLMediaKit 支持 rtsp/rtmp/rtp 推流,一般通常使用 obs/ffmpeg 推流测试,其中 FFmpeg 推流命令支持以下:

    • 1、使用 rtsp 方式推流
    # h264推流
    ffmpeg -re -i "/path/to/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test
    # h265推流
    ffmpeg -re -i "/path/to/test.mp4" -vcodec h265 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test
    
    • 1
    • 2
    • 3
    • 4
    • 2、使用 rtmp 方式推流
    #如果未安装FFmpeg,你也可以用obs推流
    ffmpeg -re -i "/path/to/test.mp4" -vcodec h264 -acodec aac -f flv rtmp://127.0.0.1/live/test
    # RTMP标准不支持H265,但是国内有自行扩展的,如果你想让FFmpeg支持RTMP-H265,请按照此文章编译:
    # https://github.com/ksvc/FFmpeg/wiki/hevcpush
    
    • 1
    • 2
    • 3
    • 4
    • 3、使用 rtp 方式推流
    # h264推流
    ffmpeg -re -i "/path/to/test.mp4" -vcodec h264 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000
    # h265推流
    ffmpeg -re -i "/path/to/test.mp4" -vcodec h265 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    观察日志

    如果推流成功,会打印这种日志:

    日志中相关字符串分别代表:

    2020-04-10 12:51:52.331 I | regist rtsp __defaultVhost__ rtp 206442D7
                                        ^           ^         ^      ^
                                      schema      vhost      app stream_id
    
    • 1
    • 2
    • 3

    播放地址

    请按照播放 url 规则来播放上述的推流。

    可以用PotPlayer,KMPlayer来播放。

    参考资料

    ZLMediaKit快速开始

    Ubuntu下安装ffmpeg完整教程

  • 相关阅读:
    精选版:用Java扩展Nginx(nginx-clojure 入门)
    Android Activity 启动时获取View的宽高为0?正确获取View宽高的方式
    【SpringBoot】Spring Boot 项目中整合 MyBatis 和 PageHelper
    【十分钟】manim安装 2022
    IMU标定之---Allan方差
    【Java篇】回顾二进制文件和字节流
    基于测地距离场的三维人脸参数化方法
    漏洞概述-0day漏洞利用原理(0)
    普中51单片机学习(EEPROM)
    前端的页面代码
  • 原文地址:https://blog.csdn.net/e891377/article/details/127691630