使用 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM