"AWS Kinesis Video Stream(kvs) -> gstreamer+opencv image processing -> kvs "过程中如何处理gstreamer?



我想创建如下图所示的管道;

https://i.stack.imgur.com/Nb17P.png

GSTREAMER_OUT = ' ! '.join([
'appsrc',
'queue',
f'video/x-raw,format=BGR,width={frame_width},height={frame_height}',
'videoconvert',
'video/x-raw,format=YV12',
'x264enc byte-stream=true',
'video/x-h264,stream-format=avc,alignment=au,profile=baseline',
' '.join([
'kvssink',
f'stream-name={kvs_out_stream_name}',
'storage-size=512',
f'access-key={access_key}',
f'secret-key={secret_key}',
'aws-region=ap-northeast-1',
# 'buffer-duration=60',
f'framerate=1',
# 'max-latency=10',
]),
])
cap = cv2.VideoCapture(in_stream_url)
out = cv2.VideoWriter(GSTREAMER_OUT, cv2.CAP_GSTREAMER, 0, target_fps, (frame_width, frame_height), True)
while True:
ret, frame = cap.read()
result = some_image_process(frame)
out.write(result)

然而,管理控制台经常显示如下所示的断帧;

https://i.stack.imgur.com/oecrR.png

整个视频:https://youtu.be/vBAgECHYJjU

我想知道如何修复这个GStreamer管道。我对Gstreamer不太熟悉,所以如果你能详细告诉Gstreamer管道,我将不胜感激。

当我删除queue并像下面的命令一样向x264enc添加选项时,我发现这是固定的;

GSTREAMER_OUT = ' ! '.join([
'appsrc',
'clockoverlay halignment=right valignment=top font-desc="Sans bold 60px"',
'videoconvert',
'video/x-raw,format=YV12',
'x264enc byte-stream=true noise-reduction=10000 speed-preset=ultrafast tune=zerolatency ',
'video/x-h264,stream-format=avc,alignment=au,profile=baseline',
' '.join([
'kvssink',
f'stream-name={kvs_out_stream_name}',
'storage-size=512',
f'access-key={access_key}',
f'secret-key={secret_key}',
'aws-region=ap-northeast-1',
# 'buffer-duration=10',
# 'connection-staleness=60',
# "fragment-acks=true",
"framerate=1",
# "key-frame-fragmentation=false",
# "max-latency=10"
]),
])

较长的示例代码:https://gist.github.com/LittleWat/c93394bb4f6dc125d1c4a66f1a7aee9d

损坏的图像已修复,但存在延迟问题。

所以我会再问一个问题。如何减少gstreamer管道在";AWS Kinesis视频流(kvs(->gstreamer+opencv图像处理->kvs";过程

最新更新