OpenCV+Python3+RTMP+Nginxを構築する

複数の入力ソースを 1 つのビデオ送信に統合する必要があるため、OpenCV+Python が必要ないくつかの処理を実行する必要があります。

ストリームのプッシュには RTMP が使用されるため、プロセスを記録するには Nginx も必要です。

ソフトウェアの準備:

この記事は 2020 年 9 月 28 日に書かれたもので、最新バージョンを使用しています (ただし、システムは互換性のために Ubuntu18 を使用しています)。

Python3+PpenCVをインストールする

Python3 に anaconda がインストールされている

pip でインストールされた opencv

https://pypi.org/project/opencv-python/#files

pip インストール opencv_python-4.4.0.44-cp36-cp36m-manylinux2014_x86_64.whl

Nginx+RTMPをインストールする

最新のソフトウェア コンポーネントをダウンロードし、フォルダーに配置します。

Nginx:

http://nginx.org/download/nginx-1.19.2.tar.gz

Nginx-RTMP:

https://github.com/arut/nginx-rtmp-module/archive/master.zip

OpenSSL:

git clone --branch OpenSSL_1_1_1-stable https://github.com/openssl/openssl

3つのファイルをダウンロードしたら、フォルダーに配置します

nginx-1.19.2フォルダーに入り、コンパイル環境を構成します。

./configure --prefix=/usr/local/nginx --with-openssl=../openssl --add-module=../nginx-rtmp-module

それから:

sudo make -j4

sudo メイクインストール

インストールしたばかりです。

次のコマンドをテストします

起動する

sudo /usr/local/nginx/sbin/nginx

停止

sudo /user/local/nginx/sbin/nginx -s stop

リロード

sudo /usr/local/nginx/sbin/nginx -s リロード

設定変更

sudo gedit /usr/local/nginx/conf/nginx.conf

rtmp 構成を挿入します。

rtmp {  
    サーバー {  
        1980 を聞く;  
        アプリケーションはライブ {  
            ライブオン;  
        }
    アプリケーション vod {             /tmp/video を再生します。         }  }     }  



設定をリロードする

sudo /usr/local/nginx/sbin/nginx -s リロード

ネットワーク リスニング ポートを確認します。

netstat -ltn

指導が始まります

ファイルプッシュテスト

FFMPG を使用してストリームをプッシュしてみてください。mp4 ファイルは私自身のビデオ ファイルです。

ffmpeg -re -i /home/guo/Videos/20200924_155520.mp4 -vcodec libx264 -vprofile ベースライン -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://127.0.0.1 :1980/ライブ/テスト

開いたらストリーミングを開始し、VLCプレーヤーを開いてURLを入力すると、プッシュしたビデオが表示されます。

 

これは、ストリーミングに問題がなく、すべてがインストールされていることを意味します。

OpenCVプッシュストリーミング

ビデオ ファイルまたは USB カメラをビデオ ソースとして使用する

import cv2
import subprocess
src="/home/guo/Videos/20200924_155520.mp4"
rtmp = 'rtmp://127.0.0.1:1980/live/test' 
cap = cv2.VideoCapture(src)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
size = (int(640), int(480))
sizeStr = str(size[0]) + 'x' + str(size[1])
 
command = ['ffmpeg',
    '-y', '-an',
    '-f', 'rawvideo',
    '-vcodec','rawvideo',
    '-pix_fmt', 'bgr24',
    '-s', sizeStr,
    '-r', '25',
    '-i', '-',
    '-c:v', 'libx264',
    '-pix_fmt', 'yuv420p',
    '-preset', 'ultrafast',
    '-f', 'flv',
    rtmp]
 
pipe = subprocess.Popen(command
    , shell=False
    , stdin=subprocess.PIPE
)
 
while cap.isOpened():
    success,frame = cap.read()
    if success==False:
        print("Err")
        break
    img=cv2.resize(frame,size)
    pipe.stdin.write(img.tostring()) 
cap.release()
pipe.terminate()

ここでは元の画像のサイズが大きくなり、拡大縮小されます。プッシュ時の結果も確認できます。

ついにそれをやり遂げました。

 

おすすめ

転載: blog.csdn.net/lianbus/article/details/108848624