来自应用程序的 OpenCv + Gstreamer,初始延迟 30 秒
OpenCv + Gstreamer from an app, getting initial 30s delay
所以我的应用程序使用 new VideoWriter(pipeline-definition);
公开 RTP 流
管道定义为:
appsrc is-live=1 do-timestamp=1 format=3 stream-type=0 min-latency=0 max-latency=500000000 ! queue leaky=2 max-size-time=500000000 ! videoconvert ! video/x-raw ! x264enc ! h264parse ! rtph264pay config-interval=10 pt=96 ! udpsink host=127.0.0.1 port=9000
我遇到的问题是在 VLC 中查看流时延迟 30 秒。无论我做什么,VLC 总是落后 29-30 秒。似乎是 appsrc
造成的,因为与 videotestsrc
相同的管道根本没有延迟。
有什么想法可以让 appsrc
立即将帧发布到流中吗?
似乎 VideoWriter
有一个内部缓冲区可以缓存 30 秒的镜头。在我的例子中,我在内存中保留了一个单例,并依靠它足够快地刷新到管道。实际上,我最终不得不通过释放数据来强制 VideoWriter
刷新数据。
我不建议将此作为问题的解决方案,但在我的情况下它起作用了,因为我仅在定义 DEBUG
时才需要此管道。
所以我的应用程序使用 new VideoWriter(pipeline-definition);
管道定义为:
appsrc is-live=1 do-timestamp=1 format=3 stream-type=0 min-latency=0 max-latency=500000000 ! queue leaky=2 max-size-time=500000000 ! videoconvert ! video/x-raw ! x264enc ! h264parse ! rtph264pay config-interval=10 pt=96 ! udpsink host=127.0.0.1 port=9000
我遇到的问题是在 VLC 中查看流时延迟 30 秒。无论我做什么,VLC 总是落后 29-30 秒。似乎是 appsrc
造成的,因为与 videotestsrc
相同的管道根本没有延迟。
有什么想法可以让 appsrc
立即将帧发布到流中吗?
似乎 VideoWriter
有一个内部缓冲区可以缓存 30 秒的镜头。在我的例子中,我在内存中保留了一个单例,并依靠它足够快地刷新到管道。实际上,我最终不得不通过释放数据来强制 VideoWriter
刷新数据。
我不建议将此作为问题的解决方案,但在我的情况下它起作用了,因为我仅在定义 DEBUG
时才需要此管道。