【问题标题】:How to copy and release a buffer in Gstreamer如何在 Gstreamer 中复制和释放缓冲区
【发布时间】:2022-01-18 23:23:07
【问题描述】:

我正在使用 Gstreamer 的 Python 绑定。我有一个 Buffer 对象,我想将其复制并添加到队列中,以便稍后可以由另一个线程处理。 我的应用程序有内存泄漏,但我不确定这是否与 Gstreamer 有关。

复制缓冲区

目前我正在像这样复制缓冲区:

gst_buffer_copied = gst_buffer.copy_deep()

这对吗?

释放内存

我需要稍后显式释放资源吗?我怎样才能做到这一点? 我试过了

gst_buffer_copied.remove_all_memory()

但我有时会遇到Segmentation fault (core dumped) 错误。不知道对不对。

【问题讨论】:

    标签: python memory buffer gstreamer


    【解决方案1】:

    gst_buffer_copied 缓冲区应该拥有它自己的内存。所以当这个缓冲区的生命周期结束时,它会负责释放它的内存。

    如果您手动删除内存块,您应该确保应用程序或管道中没有代码在之后尝试访问缓冲区的内存。

    因此,当您这样做但管道尚未完成处理此缓冲区时,它将尝试访问您刚刚释放的内存,从而导致分段错误。

    【讨论】:

    • 好吧,简而言之,删除gst_buffer_copied 不需要任何操作,对吧?没有更多引用后,垃圾收集器将释放它。
    • 是的,就是这样。在 C 代码中,您只需显式释放缓冲区,当引用计数达到 0 时它会自行销毁。然后它将删除其关联的内存。在 GC 的情况下,GC 应该触发释放。
    • 谢谢!关于副本:你认为我做得对吗?我正在与 Deepstream 合作。如果我在几秒钟后访问复制的缓冲区,则缓冲区中的数据不一样。看来我只是在复制对数据的引用,而不是实际数据。
    • 对我来说看起来是正确的。 deep 变体应该复制数据而不引用它。再说一次,我们不知道你在用这个缓冲区做什么..
    • 就我而言,我还没有解决这个问题,但既然你回答了我所有的问题,选择你的帖子作为答案似乎是正确的。谢谢!
    猜你喜欢
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多