Как произвести склейку видео со звуком и направить в 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? Да ещё и с синхронизацией звука и видео? Есть идеи?