Home > Blockchain >  Multiple streams with ffmpeg and python opencv
Multiple streams with ffmpeg and python opencv

Time:01-30

I need to run multiple streams from python open cv to rtmp/rtsp with FFMPG. Now I can see two streams are going via ffmpeg (in console the information are mixed). In destinations the first stream is empty while second stream plays correctly (first stream metedata is reaching to destination).

Multiple stream semaratly in destination.

## st.txt = 'rtsp://ip:port/source/1' & 'rtsp://ip:port/source/2'
from multiprocessing.pool import ThreadPool
import cv2
import random
import subprocess

def f(x):
    name = (x.split('/'))[-1]
    y=30
    if len(x)==1:
        x = int(x)

    cam = cv2.VideoCapture(x)
    width = cam.get(cv2.CAP_PROP_FRAME_WIDTH)
    height = cam.get(cv2.CAP_PROP_FRAME_HEIGHT)
    fps = cam.get(cv2.CAP_PROP_FPS)
    def streamer():
        command = ['ffmpeg',
                            '-r', str(fps ),
                            '-y',
                            '-f', 'rawvideo',

                            '-pix_fmt', 'bgr24',
                            '-s', "{}x{}".format(int(width),int(height)),
                            '-i', '-',
                            '-c:v', 'libx264',
                            '-pix_fmt', 'yuv420p',
                            '-preset', 'fast',
                            '-bufsize','7000k',
                            '-flvflags', 'no_duration_filesize', 
                            '-g','180',
                            '-f', 'flv',
                            'rtmp://ip:port/live/'  str(name)]                        
        return command                        
    p_stream = subprocess.Popen(streamer() , stdin=subprocess.PIPE)


    while cam.isOpened():
                ret, frame = cam.read()
                if not ret:
                    break
                cv2.imshow(str(name),frame)
                p_stream.stdin.write(frame.tobytes()) 
                key = cv2.waitKey(1)
                
                if key == ('w'):
                    cam.release()
                    cv2.destroyAllWindows()
                    break

            





def ls():
    with open(r'st.txt') as f:
        lns = [line.rstrip('\n') for line in f]  
         return lns


if __name__ == '__main__':
    
    pool = ThreadPool()
    results = pool.map(f, ls())

CodePudding user response:

Tried this code in better hardware and it works for multiple stream at the same time.

  • Related