opencv - 如何使用我从 nginx 服务器获得的视频数据流?

标签 opencv nginx ffmpeg rtmp pyffmpeg

我的网络中有三个节点:
数据服务器 --- 节点 1 --- 节点 2。
我的视频数据“friends.mp4”保存在 dataServer 上。我将 dataServer 和 node2 都作为 rtmp-nginx 服务器启动。我在 node1 上使用 ffmpeg 在 dataServer 上提取数据流,并将转换后的数据流推送到 node2 上的“实时”应用程序。
这是我为 node2 配置的 nginx.conf。

worker_processes  1;
events {
    worker_connections  1024;
}

rtmp {
    server {

    listen 1935;

    chunk_size 4000;

application play {
        play /usr/local/nginx/html/play;
    }

application hls {
        live on;
        hls on;
        hls_path /usr/local/nginx/html/hls;
    hls_fragment 1s;
    hls_playlist_length 4s;
    }

application live  
    {
        live on; 
    allow play all;
    }
}
}
我想运行这个python代码来识别friends.mp4中的面孔:
导入简历2
vid_capture=cv2.VideoCapture("rtmp://127.0.0.1:1935/live")
face_detect = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
if (vid_capture.isOpened() == False):
    print("Error opening the video file")
else:
    fps = vid_capture.get(5)
    print("Frames per second : ", fps,'FPS')
    frame_count = vid_capture.get(7)
    print('Frame count : ', frame_count)

while(vid_capture.isOpened()):
    ret, frame = vid_capture.read()
    if ret == True:
        gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
        face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3)
        for x, y, w, h in face_zone:
            cv2.rectangle(frame, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2)
            cv2.circle(frame, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2)
        cv2.imshow('Frame', frame)
        key = cv2.waitKey(50)
        if key == ord('q'):
            break
    else:
        break
vid_capture.release()
cv2.destoryAllWindows()
但我不能这样做,因为 cv2.VideoCapture 无法从“rtmp://127.0.0.1:1935/live”获取数据流。也许是因为这个路径不是文件。如何获取 nginx 服务器接收的视频流并将其放入我的 openCV 模型?有没有办法让我只访问 niginx 服务器接收到的 dataStreaming 并使其成为 openCV 可以使用的 python 对象?

最佳答案

尝试将文件更改为实时流,然后使用 cv2 处理流:

DataServer --> Node1(FFmpeg MP4 to RTMP) --> Node2(Media Server)
Node2 ---> Node1(cv2 process RTMP)
对于 Node1,您可以运行如下命令:
ffmpeg -re -i friends.mp4 -c copy -f flv rtmp://node2/live/livestream
然后你得到一个 RTMP 流并再次在 Node1 上处理它:
cv2.VideoCapture("rtmp://node2:1935/live/livestream")
请注意,RTMP 不在 node1 上,所以你永远不要使用 localhost127.0.0.1让 cv 消耗它。

关于opencv - 如何使用我从 nginx 服务器获得的视频数据流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71331153/

相关文章:

OpenCV2.4 python - 立体匹配和视差图

linux - nginx location deny by file extension 语法

php - Ubuntu 上本地的 Nginx phpmyadmin 和 magento 2

ffmpeg:以 (.rgb) 格式组合音频 (.wav) 和视频

ffmpeg 4.0 解码 h264 比旧版本慢(n2.8.14)

android - ffmpeg android构建中的libx264编码器错误

c++ - 如何在cv::Mat的一部分中设置零值

c++ - UVC 相机 "Still Pin"在 Linux C++ 中捕获

java - OpenCV Java : Compare Bounding Rect's y value, 清除不需要的

http - Nginx 服务器允许客户端在一个 HTTP 1.1 连接中发送的最大请求数是多少