如何正确使用libstagefright的MediaBuffer?

时间:2014-02-02 02:48:28

标签: android c++ android-ndk stagefright

I:

  1. 创建android::MediaBufferGroup;
  2. 在初始化时填写多个buf_group.add_buffer(new android::MediaBuffer(bufsize));;
  3. 当我需要缓冲区发送到某处时,请buf_group->acquire_buffer(&buffer);
  4. 使用buffer->data()获取实际内存位置以存储数据,使用set_range并设置元数据,然后将缓冲区提供给其他组件;
  5. 其他组件release是缓冲区,将它们重新调回MediaBufferGroup。
  6. 它有效,但不可靠。有时获取的缓冲区data()返回NULL,有时程序在release()崩溃...

    如何正确使用MediaBufferGroup?我应该使用一些同步吗?

2 个答案:

答案 0 :(得分:0)

几乎所有步骤都是正确的。不明确的一点是在步骤4中。通常,消费者通过MediaBuffer呼叫从消费者处提取read。所以,我在你的设置中假设,

  1. 上述所有步骤均由制作人

  2. 执行
  3. 消费者调用mSource->read(&newBuffer);,其中newBuffer定义为MediaBuffer *newBuffer;

  4. 在制作人的最后,MediaBuffer *mBuffer;。将处理读取调用,并将输出填充为*out = mBuffer;

  5. 为安全起见,请在此步骤后将mBuffer初始化为NULL

  6. 消费缓冲后,消费者应释放缓冲区newBuffer->release;

  7. 同样,为安全起见,请在此步骤后将newBuffer初始化为NULL

  8. 通过这些更改,我认为您的代码应该可以根据您的描述正常工作。

答案 1 :(得分:0)

MediaBuffer是stagefright框架中的基本容器。

关于MediaBuffer / MediaBufferGroup / MediaSource的使用,ASOP frameworks/av/cmds/stagefright下有一些简单的示例代码。

注意类SineSource的实现及其用法。