Как произвести склейку видео со звуком и направить в rtsp поток?

Задача заключается в следующем: на входе получаем rtsp поток(с видео и звуком). Звук не трогаем, а вот над видео нужно произвести обработку, а затем объединив со звуком отправить в rtsp поток(всё это в реальном времени, задержки нужны минимальные). Обработка видео производится средствами opencv.

На данный момент есть реализация без звука с использованием rtsp-simple-server для создания rtsp потока:

import cv2 as cv
import numpy as np
import subprocess as sp
inp_url1 = ...
out_url2 = ...
cap = cv2.VideoCapture(inp_url) # backend на ffmpeg
command = ['ffmpeg',
           '-r', '30',
           '-i', '-',
           '-f', 'rtsp',
           out_url2]
process = sp.Popen(command, stdin=sp.PIPE)
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret:
        ... #обработка кадра
        _, frame2 = cv2.imencode('.png', frame)
        process.stdin.write(frame2.tobytes())

Звук из rtsp научился извлекать пока только таким образом:

command = ['ffmpeg',
            '-i', url,
            '-acodec', "copy",
            '-vn',
            '-f', 'mp2',
            '-'
            ]
process = sp.Popen(command, stdout=sp.PIPE)
while True:
    frame = process.stdout.read(chunk)

И при объединении примеров выше, для захвата аудио + видео ни о какой синхронизации по временным меткам речи не идёт(знает кто нибудь как это сделать?)

Для передачи звука и видео в rtsp поток хотелось бы воспользоваться командой:

command = ['ffmpeg',
           '-i', '-', # audio frame
           '-i', '-', # video frame
           '-f', 'rtsp',
           rtsp_server]
process = sp.Popen(command, stdin=sp.PIPE)

Вот только как подать 2 объекта(звук и видео) в stdin? Да ещё и с синхронизацией звука и видео? Есть идеи?


Ответы (0 шт):