zoukankan      html  css  js  c++  java
  • 使用 ffmpeg nginx rtmp 搭建实时流处理平台

    环境: ubuntu 16.04
    问题引入:

    使用 opencv 获取摄像头数据帧, 进行处理之后(如进行 keypoint 识别), 将 opencv 中图像的 Mat类型转化为 ffmpeg 的 AvPicture 格式, 然后推送到流媒体服务器上, 本地通过 VLC 播放器查看实时检测效果

    ffmpeg

    sudo apt-get install ffmpeg -y
    

    然后 /etc/ffserver.conf 配置外部可接入地址 在文件的 <feed></feed> 部分添加

    BindAddress 0.0.0.0
    ACL allow 127.0.0.1
    ACL allow localhost
    # 假设你的网络地址段为 `192.168.x.x`
    ACL allow 192.168.0.0 192.168.255.255
    
    

    然后 ffserver 开启服务器

    ffserver -d -f /etc/ffserver.conf
    
    

    使用 ffmpeg 查看可用视频和音频设备

    通用: 通过 ffmpeg -devices 查看可用设备类型

    linux 查看可用设备

    ffmpeg -f v4l2 -list_devices true -i ""
    ls -l /dev/video*
    

    macOS 查看可用设备 ffmpeg -f avfoundation -list_devices true -i ""

    ffmpeg 基本操作

    转播

    ffmpeg  -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec libx264 -acodec libvo_aacenc  -f rtsp rtsp://9.123.143.116:8090/live.sdp
    

    摄像头直播

    ffmpeg -f video4linux2  -framerate 25 -video_size 640x480 -i /dev/video0 -vcodec libx264 -preset ultrafast -acodec libfaac -f flv  rtmp://10.210.107.141/live
    

    本地文件播放

     ffmpeg -re -i smurf.flv  -vcodec copy -acodec copy -f flv -y rtmp://9.123.143.116/live
    

    搭建 rtsp 服务器

    github 上有现成的开源的封装好的 rtsp 服务器工具, 这里使用 EasyDarwin

    git clone https://github.com/EasyDarwin/EasyDarwin
    
    

    修改配置文件 cfg.js, 将 rtsp_tcp_port 端口修改为与 /etc/ffserver.conf 中 HTTPPort 相同 (不知道什么原理)

    // cfg.js
    module.exports = {
        http_port: 10090,
        # I change 554 to 8090 to map /etc/ffserver.conf  http port
        rtsp_tcp_port: 8090,
        defaultPwd: '123456',
        rootDir: __dirname,
        wwwDir: path.resolve(__dirname, "www"),
        dataDir: path.resolve(os.homedir(), ".easydarwin")
    }
    
    # /etc/ffserver.conf
     
    # Port on which the server is listening. You must select a different
    # port from your standard HTTP web server if it is running on the same
    # computer.
    
    HTTPPort 8090
    

    Linux 平台, 执行 start.sh 运行服务执行 stop.sh 停止服务

    一定要将 cfg.js 中的 rtsp_tcp_port 端口号设置与与 /etc/ffserver.conf HTTPPort端口号相同

    测试代码

    ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -strict -2 -rtsp_transport tcp -vcodec h264 -f rtsp rtsp://9.123.143.116:8090/live/
    
    ffmpeg -f v4l2  -framerate 25 -video_size 640x480 -i  /dev/video0 -strict -2 -vcodec libx264 -acodec libvo_aacenc -f rtsp rtsp://9.123.143.116:8090/live/
    

    搭建 rtmp 服务器

    这里是采用比较常用的 nginx 来搭建rtmp 服务器

    环境: nginx-1.8.1 + nginx-rtmp-module

    nginx服务器的搭建

    1.安装依赖

    sudo apt-get update
    sudo apt-get install libpcre3 libpcre3-dev
    sudo apt-get install openssl libssl-dev
    

    2.下载 nginx-rtmp-module 与 nginx-1.8.1

    git clone https://github.com/arut/nginx-rtmp-module.git
    wget http://nginx.org/download/nginx-1.8.1.tar.gz
    tar -zxvf nginx-1.8.1.tar.gz
    

    3.配置并编译 nginx

    进入到 nginx-1.8.1 安装目录, 使用 nginx 的默认配置,添加 nginx 的 rtmp 模块。 add-module 为下载的 nginx-rtmp-module 文件路径。

    cd nginx-1.8.1
    ./configure --add-module=../nginx-rtmp-module
    make
    sudo make install
    

    4.运行测试 nginx

    进入安装目录 /usr/local/nginx,运行命令 ./sbin/nginx

    注意:以后所有的命令都在/usr/local/nginx目录运行,也nginx配置文件的相对目录。

    cd /usr/local/nginx
    ./sbin/nginx
    

    打开浏览器在地址栏输入:localhost。如果,如下图显示那样就证明您的nginx服务器搭建成功了。

    nginx config

    步骤如下

    1. 修改 nginx.conf 文件
    2. 重启 nginx 服务
    3. 修改 /etc/hosts, 添加本机地址对应的域名, 如 "9.123.143.116 nowgood"
    4. 打开浏览器查看效果, 注意网址为 http://localhost/stat
    sudo vim /usr/local/nginx/conf/nginx.conf
    
    sudo ./sbin/nginx -s reload
    
    #/usr/local/nginx/conf/nginx.conf
    #注明:请勿直接覆盖原来的conf文件,这只是部分有关直播的内容
    #配置RTMP,这个配置格式在github的readme上有详细说明
    
    worker_processes  1;
    events {
       worker_connections  1024;
    }
    rtmp {                
        server {
            listen 1935;  #服务端口--默认
            chunk_size 4096;   #数据传输块的大小--默认
            #设置直播的application名称是 live
        application live{ 
            live on; #live on表示开启直播模式
            }
            #设置推流的应用名称
        application push{ 
            live on; #开启直播
            push rtmp://rtmp-postbird/live; #推流到上面的直播应用
            }
        }
    }
    
    http{
       include       mime.types;
       default_type  application/octet-stream;
       sendfile        on;
       keepalive_timeout  65;
     server {
            listen       80; # 端口
        server_name  nowgood; #设置http服务器监听的域名 hosts中配置了
        
        #下面两个是加上去的,用来配置直播的http访问
        location /stat {    
                    rtmp_stat all;
                    rtmp_stat_stylesheet stat.xsl;
            }
            location /stat.xsl {
            #注意这里的路径不能错误,直接写绝对路径就可以
            root /home/gbsaa/wangbin/nginx-rtmp-module/;
            }
            location / {
                root   html;
                index  index.html index.htm;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    
    

    测试代码

    ffmpeg -f v4l2  -framerate 25 -video_size 640x480 -i  /dev/video0 -strict -2 -vcodec libx264 -acodec libvo_aacenc  -f flv rtmp://nowgood/live/webcam
    
    ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -strict -2 -vcodec libx264 -acodec libvo_aacenc -f flv rtmp://nowgood/live
    

    推流

    这里借用 jkuri 大兄弟的代码, 不过不使用他的用 docker 搭建的 nginx-rtmp 的服务器(我没有运行成功, 不过很有借鉴意义)

    git clone https://github.com/jkuri/opencv-ffmpeg-rtmp-stream
    

    将代码中的推流地址改为之前我们搭建的 rtmp 服务器的地址后, 使用功能 cmake 编译运行, 就可以将摄像头采集图像进行直播了

    一些可能需要安装的依赖

    sudo apt-get install v4l-utils
    v4l2-ctl -d /dev/video0 --list-formats
    
    sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
    sudo apt-get install libavcodec-extra
    

    参考

    https://github.com/opencv-ffmpeg-rtmp-stream
    http://www.ptbird.cn/nginx-rtmp-module-server.html
    https://zhuanlan.zhihu.com/p/28009037

  • 相关阅读:
    android app压力测试(二)——monkey测试结果分析
    android app压力测试(一)---monkey介绍及基本使用
    如何根据apk文件获取包名
    adb常用命令
    APP的安装卸载测试
    unittest生成html测试报告
    python,向已经存在数据的excel中添加数据
    HTTP协议简介
    jmeter如何确定ramp-up时间
    jmeter分布式压测
  • 原文地址:https://www.cnblogs.com/nowgood/p/ffmpegnginx.html
Copyright © 2011-2022 走看看