複数の入力ソースを 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()
ここでは元の画像のサイズが大きくなり、拡大縮小されます。プッシュ時の結果も確認できます。
ついにそれをやり遂げました。