2013-03-04 18 views
5

Próbuję użyć Nexusa do przetestowania kodowania za pomocą interfejsów API Mediacodec. Widzę, że inputBuffers dostarczane przez koder to 119040 (logując inputBuffers.capacity). Ale rozmiar ramki, tj. Dane wejściowe, wynosi 460 800. Otrzymałem komunikat o błędzie pod numerem z buffer overflow. Dlatego właśnie ustawiłem bufor wejściowy na 460800. API, które mogłem znaleźć, to BufferInfo.set. Jednak nie mogę znaleźć sposobu na dołączenie tego ustawienia do kodera. Czy ktoś może pomóc? Dzięki!!!Jak ustawić rozmiar bufora kodera utworzonego przez 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);} 

Odpowiedz

2

Nie ustawiasz rozmiaru bufora wejściowego. Rozmiar jest określany przez MediaFormat, w szczególności format szerokości, wysokości i koloru. Jeśli twoje dane wejściowe mają inny rozmiar, będziesz musiał przekonwertować go na format oczekiwany przez kodek.

To nie jest całkowicie banalne, ale jest wykonalne. Przykłady, patrz testy bufora do bufora w CTS EncodeDecodeTest. Test sprawdza kodek, aby zobaczyć, jaki format koloru jest obsługiwany, generuje ramki w tym formacie, przesyła je do kodera, a następnie dekoduje wideo i potwierdza, że ​​to, co wychodzi jest takie samo, jak to, co się wydarzyło.

Test zasadniczo wymaga API 18 (Android 4.3), ale kod bufora do bufora będzie działał w interfejsie API 16. Niezależnie od tego, czy działa na danym urządzeniu, jest inne pytanie - skoro test CTS nie istniał do API 18, to możliwe, że urządzenia przed-4.3 zrobiły to źle.

3

jestem późno do partii, ale w oparciu o: Android MediaCodec Documentation myślę poprawny sposób zmienić bufor będzie dostosować MAX_INPUT_SIZE, coś jak:

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

to działa na mnie! –

Powiązane problemy