2013-03-04 2 views
5

Я пытаюсь использовать Nexus для проверки кодировки с помощью API Mediacodec. Я вижу, что входные буферы, обеспечиваемые кодером, составляют 119040 (путем регистрации вводаBuffers.capacity). Но размер кадра, то есть ввода, составляет 460800. Я получил сообщение об ошибке на inputBuffer.put с buffer overflow. Поэтому я собирался установить входной буфер на 460800. API, который я мог найти, - BufferInfo.set. Однако я не могу найти способ привязать этот параметр к кодеру. Может ли кто-нибудь помочь? Благодаря!!!Как установить размер буфера кодировщика, созданный MediaCodec

encoder = MediaCodec.createByCodecName(codecInfo.getName()); 
ByteBuffer[] inputBuffers = encoder.getInputBuffers(); 
if (inputBufferIndex >= 0) { 
    ByteBuffer inputBuffer = inputBuffers[inputBufferIndex]; 
    inputBuffer.clear(); 
    inputBuffer.put(input); 
encoder.queueInputBuffer(inputBufferIndex, 0, input.length, 0, 0);} 

ответ

2

Вы не устанавливаете размер входного буфера. Размер определяется MediaFormat, в частности шириной, высотой и цветовым форматом. Если ваши входные данные имеют разный размер, вам нужно будет преобразовать их в формат, который ожидает кодек.

Это не совсем тривиально, но выполнимо. Примеры см. В тестах буфер-буфер в CTS EncodeDecodeTest. Тест запрашивает кодек, чтобы узнать, какой цветной формат поддерживается, генерирует кадры в этом формате, передает их в кодировщик, затем декодирует видео и подтверждает, что то, что выходит, такое же, как и то, что произошло.

Тест обычно требует API 18 (Android 4.3), но код буфера-буфера будет работать в API 16. Независимо от того, работает ли он на любом данном устройстве, это другой вопрос - поскольку тест CTS не существовал до API 18, это возможно, для устройств до 4.3 можно сделать это неправильно.

3

Я опоздал на вечеринку, но на основе: Android MediaCodec Documentation Я думаю, что правильный способ изменить буфер будет регулировать MAX_INPUT_SIZE, что-то вроде:

int width=800; 
int height=480; 
encoder = MediaCodec.createByCodecName(codecInfo.getName()); 
format = MediaFormat.createVideoFormat ("video/avc", width, height); 
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE,655360); // 0.5MB but adjust it as you need. 
+0

Это работает для меня! –

Смежные вопросы