问题描述
我有一个带有appsink的GStreamer管道
filesrc location=test.mp4 ! decodebin ! video/x-raw ! queue max-size-bytes=0 max-size-time=100000000 ! appsink name=appSink sync=false max-buffers=1 drop=false
我从appsink中提取了一个样本,然后获得了缓冲区,将其映射为只读并存储了映射信息(以便以后访问原始内存)。
sample: Gst.Sample = self.__sink.pull_sample()
self.__buffer: Gst.Buffer = sample.get_buffer()
self.__buffer_map: Gst.MapInfo = self.__buffer.map(Gst.MapFlags.READ)
然后我想在输出管道中使用相同的数据(而不复制它),例如:
appsrc name=appSrc block=true ! video/x-raw,format=(string)NV12,width=1920,height=1080,framerate=30/1 ! videoconvert ! ximagesink
为此,这是我能想到的最好的方法:
shared_buffer_memory = self.__buffer.get_all_memory()
buf = Gst.Buffer.new()
buf.insert_memory(-1,shared_buffer_memory)
self.__src.push_buffer(buf)
#sleep(0.05)
如果执行此操作,则可以正确看到第一帧,但其他所有帧均为绿色。很好,因为buf的基础内存超出范围并同时释放。如果我在push_buffer之后放置sleep(0.05),它将显示所有帧,但是我认为缓冲区后面的内存是双重释放的:
** (python3.9:6745): CRITICAL **: 09:23:54.645: gst_vaapi_image_unmap: assertion 'image != NULL' failed
我想从appsink中获取框架,然后将其推入输出管道而不进行复制。这样做的最佳方法是什么? (在我的情况下,单个管道不合适)。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)