I:
android::MediaBufferGroup
; buf_group.add_buffer(new android::MediaBuffer(bufsize));
; buf_group->acquire_buffer(&buffer)
; buffer->data()
获取实际内存位置以存储数据,使用set_range
并设置元数据,然后将缓冲区提供给其他组件; release
是缓冲区,将它们重新调回MediaBufferGroup。它有效,但不可靠。有时获取的缓冲区data()
返回NULL,有时程序在release()
崩溃...
如何正确使用MediaBufferGroup?我应该使用一些同步吗?
答案 0 :(得分:0)
几乎所有步骤都是正确的。不明确的一点是在步骤4中。通常,消费者通过MediaBuffer
呼叫从消费者处提取read
。所以,我在你的设置中假设,
上述所有步骤均由制作人
消费者调用mSource->read(&newBuffer);
,其中newBuffer
定义为MediaBuffer *newBuffer
;
在制作人的最后,MediaBuffer *mBuffer;
。将处理读取调用,并将输出填充为*out = mBuffer;
。
为安全起见,请在此步骤后将mBuffer
初始化为NULL
。
消费缓冲后,消费者应释放缓冲区newBuffer->release;
同样,为安全起见,请在此步骤后将newBuffer
初始化为NULL
。
通过这些更改,我认为您的代码应该可以根据您的描述正常工作。
答案 1 :(得分:0)
MediaBuffer是stagefright框架中的基本容器。
关于MediaBuffer / MediaBufferGroup / MediaSource的使用,ASOP frameworks/av/cmds/stagefright下有一些简单的示例代码。
注意类SineSource的实现及其用法。