Как правильно использовать MediaBuffer в libstagefright?

0

Я:

  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.

Он работает, но не надежно. Иногда полученные data() буфера data() возвращают NULL, иногда программа вылетает в release()...

Как правильно использовать MediaBufferGroup? Должен ли я использовать некоторую синхронизацию?

Теги:
android-ndk
stagefright

2 ответа

0

MediaBuffer - это основной контейнер в платформе stagefright.

Об использовании MediaBuffer/MediaBufferGroup/MediaSource. Есть несколько простых примеров кода в рамках ASOP/av/cmds/stagefright.

Обратите внимание на реализацию класса SineSource и его использование.

0

Почти все ваши шаги верны. Непонятная точка не MediaBuffer на шаге 4. Как правило, MediaBuffer вытягивается потребителем от производителя через read. Итак, я полагаю, что в вашей настройке,

  1. Все этапы, упомянутые выше, выполняются производителем

  2. Пользователь вызывает mSource->read(&newBuffer); где newBuffer определяется как MediaBuffer *newBuffer;

  3. На MediaBuffer *mBuffer; производителя MediaBuffer *mBuffer; , Чтение вызова будет обработано, и вывод будет заполнен как *out = mBuffer; ,

  4. Для безопасности, пожалуйста, инициализируйте mBuffer до NULL после этого шага.

  5. После потребления буфера потребитель должен освободить буфер newBuffer->release;

  6. Опять же, для безопасности, пожалуйста, инициализируйте newBuffer до NULL после этого шага.

С этими изменениями я предполагаю, что ваш код должен работать нормально, основываясь на вашем описании.

  • 0
    Должен ли буфер быть acquire_buffer d в том же потоке, что и mSource->read , или его можно подготовить заранее? Т.е. я могу получить новые буферы из одного потока, в то время как другой поток release старые буферы?
  • 0
    @Vi .. Пока ссылки совпадают, вы можете acquire и release буферы в двух потоках. Я полагаю , вы бы сохранить правильную ссылку после того, как вы должны acquire D тот же, который затем release д из другого потока. Это также может помочь использовать мьютекс, чтобы избежать случайного одновременного доступа.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню