Я пытаюсь написать простой видеокодер, который использует платформу Android MediaCodec
класс в режиме «ввода поверхности».
Вот шаги, которые я выполняю (поддержка кода для краткости опущена):
mediaCodec = MediaCodec::CreateByType(looper, "video/avc", true);
mediaCodec->configure(config, NULL, NULL, CONFIGURE_FLAG_ENCODE);
mediaCodec->createInputSurface(&inputSurface);
mediaCodec->start();
После этого я пытаюсь удалить буфер из созданной входной поверхности (которая является IGraphiBufferProducer
интерфейс объекта), но это не с NO_INIT
ошибка:
inputSurface->dequeueBuffer(&slot, &fence, w, h, format, 0);
Сообщение об ошибке в журнале ADB:
BufferQueueProducer: [GraphicBufferSource] dequeueBuffer: BufferQueue has no connected producer
Есть идеи, почему в очереди на буфер нет подключенного производителя? Я бы предположил, что MediaCodec
Класс будет обрабатывать создание очереди буфера, а также подключение производителя и потребителей к очереди.
Я использую Android API уровня 26 (7.1.2). Я использую библиотеки уровня платформы, потому что мой вариант использования требует доступа к GraphicBuffer
объекты.
Заранее спасибо!
РЕДАКТИРОВАТЬ: Общая идея заключается в следующем:
От IGraphiBufferProducer
документация:
// * NO_INIT - the buffer queue has been abandoned or the producer is not
// connected.
Я предполагаю, что часть, которая отсутствует в вашем коде, это «соединение».
IGraphiBufferProducer
есть такой метод, вы используете его?
Других решений пока нет …