跳至主要內容

webrtc 编译与使用

ZLMediaKit大约 3 分钟

环境

编译机器:
centos 7.6
gcc version 5.4.0 (GCC)
cmake version 3.20.5

依赖准备

  • openssl 安装 (openssl 版本要求 1.1 以上)

    $ wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
    $ tar -xvzf openssl-1.1.1k.tar.gz
    $ yum install -y zlib zlib-devel perl-CPAN
    $ ./config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl
    $ make && make install
    $ echo "/usr/local/lib64/" >> /etc/ld.so.conf
    $ echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
    $ ldconfig
    $ ln -s /usr/local/openssl/bin/openssl  /usr/local/bin/openssl # 替换系统openssl,非必须
    $ openssl version -a
    
  • libsrtp 安装

    点击这里open in new window下载安装

    $ tar -xvzf libsrtp-2.3.0.tar.gz
    $ cd libsrtp-2.3.0
    $ ./configure --enable-openssl --with-openssl-dir=/usr/local/openssl
    $ make -j8 && make install
    

    对于一些比较新的编译环境(如 GCC 10+),编译 libsrtp-2.3.0 可能会存在问题,可以考虑切换到 2.5.0 版本,即

    $ wget https://github.com/cisco/libsrtp/archive/refs/tags/v2.5.0.tar.gz
    $ tar -xvzf libsrtp-2.5.0.tar.gz
    $ cd libsrtp-2.5.0
    

编译

  • 下载 zlm 源码

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

    $ mkdir build
    $ cd build
    $ cmake .. -DENABLE_WEBRTC=true  -DOPENSSL_ROOT_DIR=/usr/local/openssl  -DOPENSSL_LIBRARIES=/usr/local/openssl/lib
    $ cmake --build . --target MediaServer
    
    # 最终输出
    [ 96%] Built target test_rtcp_fci
    [ 96%] Building CXX object tests/CMakeFiles/test_rtp.dir/test_rtp.cpp.o
    [ 97%] Linking CXX executable ../../release/linux/Debug/test_rtp
    [ 97%] Built target test_rtp
    [ 97%] Building CXX object tests/CMakeFiles/test_wsServer.dir/test_wsServer.cpp.o
    [ 97%] Linking CXX executable ../../release/linux/Debug/test_wsServer
    [ 97%] Built target test_wsServer
    [ 97%] Building CXX object tests/CMakeFiles/test_server.dir/test_server.cpp.o
    [ 97%] Linking CXX executable ../../release/linux/Debug/test_server
    [ 97%] Built target test_server
    [ 98%] Built target jsoncpp
    [ 98%] Linking CXX executable ../../release/linux/Debug/MediaServer
    [100%] Built target MediaServer
    

修改配置文件

由于 webrtc 协议需要告知播放器服务器所在 ip,如果该 ip 对播放器不可见,会导致 webrtc 无法联通。请修改配置文件中rtc.externIP为播放器可见 ip,如果不设置该配置项,zlmediakit 将获取网卡 ip(一般是内网 ip),那么将无法跨域 nat 使用 webrtc。

[rtc]
#rtc播放推流、播放超时时间
timeoutSec=15
#本机对rtc客户端的可见ip,作为服务器时一般为公网ip,置空时,会自动获取网卡ip
externIP=
#rtc udp服务器监听端口号,所有rtc客户端将通过该端口传输stun/dtls/srtp/srtcp数据,
#该端口是多线程的,同时支持客户端网络切换导致的连接迁移
#需要注意的是,如果服务器在nat内,需要做端口映射时,必须确保外网映射端口跟该端口一致
port=8000
#设置remb比特率,非0时关闭twcc并开启remb。该设置在rtc推流时有效,可以控制推流画质
rembBitRate=1000000

测试

最新的 zlmediakit 源码自带有效的 ssl 证书default.pem,对应的域名是default.zlmediakit.com,该域名解析到的 ip 为127.0.0.1,用户在浏览器中打开 https://default.zlmediakit.com/webrtc/open in new window即可开始测试。请先推流后,再测试播放。如果 webrtc 无法播放, 请参考此issueopen in new window

问题解决

Q And A(播放问题) ?

  • obs 推流 rtc 播放一卡一卡?

    web 的 rtc h264 不支持 B 帧,需要去掉 B 帧, 使用 FFmpeg 时需要添加-bf 0参数,或者指定 h264 profile 为 baseline

  • rtsp 推流,rtc 播放不成功?

    rtsp 推流需要把 zlm 的配置文件中的 directProxy 设置为 0

  • webrtc 视频或者音频播放不出来?

    web 客户端的 rtc 支持 h264,opus/48000/2,pcma/8000,pcmu/8000 等编码格式,检查一下编码格式是否正确,一般都是音频不支持,需要使用 transcode 分支来转码(视频不会转码)