2013-03-04 16 views
5

Sto cercando di utilizzare Nexus per testare la codifica con le API Mediacodec. Riesco a vedere l'inputBuffer fornito dal codificatore è 119040 (registrando inputBuffers.capacity). Ma la dimensione del frame, cioè l'input, è 460800. Ho ricevuto un messaggio di errore a inputBuffer.put con buffer overflow. Quindi stavo per impostare il buffer di input su 460800. L'API che ho trovato è BufferInfo.set. Tuttavia, non riesco a trovare un modo per collegare questa impostazione all'encoder. Qualcuno potrebbe aiutare? Grazie!!!Come impostare la dimensione del buffer dell'encoder creata da 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);} 

risposta

2

Non si imposta la dimensione del buffer di input. La dimensione è determinata dal MediaFormat, in particolare larghezza, altezza e formato colore. Se i dati di input hanno una dimensione diversa, sarà necessario convertirli nel formato previsto dal codec.

Questo non è del tutto banale ma è fattibile. Per esempi, vedere i test buffer-to-buffer nel CTS EncodeDecodeTest. Il test interroga il codec per vedere quale formato di colore è supportato, genera fotogrammi in quel formato, li invia all'encoder, quindi decodifica il video e conferma che quello che esce è lo stesso di quello che è andato.

Il test in genere richiede l'API 18 (Android 4.3), ma il codice buffer-to-buffer funzionerà nell'API 16. Indipendentemente dal fatto che funzioni su un dato dispositivo è una domanda diversa - poiché il test CTS non esisteva fino all'API 18, è possibile che i dispositivi precedenti alla 4.3 lo facciano male.

3

Sono in ritardo alla festa, ma sulla base: Android MediaCodec Documentation Penso che il modo corretto per modificare il buffer sarà quello di regolare il MAX_INPUT_SIZE, qualcosa come:

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

Funziona per me! –

Problemi correlati