我试图使用 opencv 从捕获设备读取帧,处理它们,然后使用以下 Python 代码将它们发送到标准输出(stdout):
import cv2
import numpy as np
import subprocess
import sys
def process_frame(frame):
// some frame processing work here
sys.stdout.write(frame.tobytes())
sys.stdout.flush()
#input stream
input_dev = "/dev/video0"
# Open the input video stream
input_stream = cv2.VideoCapture(input_dev)
if not input_stream.isOpened():
print("Error: Could not open input stream.")
exit()
input_stream.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
input_stream.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
while True:
ret, frame = input_stream.read()
if not ret:
break
# Process the frame and send it to standard output (stdout)
process_frame(frame)
# Release the video stream
input_stream.release()
之后我使用 ffmpeg 读取输出,并从 alsa 设备添加音频:
python ocv.py | ffmpeg \
-f alsa -thread_queue_size 1024 -ac 2 -ss 13 -i hw:2,0 \
-f rawvideo -pixel_format bgr24 -video_size 1280x720 -framerate 20 -thread_queue_size 1024 -i - \
-pix_fmt yuv420p -filter:v scale=in_color_matrix=auto:in_range=auto:out_color_matrix=bt709:out_range=tv \
-colorspace:v bt709 -color_primaries:v bt709 -color_trc:v bt709 -color_range:v tv \
-c:v libx264 -aspect 16/9 -b:v 1M -maxrate 2M -bufsize 1M -preset veryfast \
-tune fastdecode -tune zerolatency -c:a aac -b:a 128k -f mpegts udp://224.0.0.1:1206?pkt_size=1316
正如我所指出的,存在音频/视频同步问题,因为音频大约领先视频 8 秒,可能是由于使用 OpenCV 进行帧处理所致。
尝试过:
-filter:a "adelay=8000|8000"
-itsoffset 8.0 (before the audio input)
但它们似乎都不起作用,或者也许我使用了错误的命令形式。
如果有的话,谁能指导一下音频和视频自动同步的方法吗?如果不是,使音频延迟约 8 秒的命令的正确形式是什么?
您是否尝试过使用 -use_wallclock_as_timestamps 选项? 然后,分数将被分配给系统的时钟