2016-06-16 26 views
21

Ich möchte mit MediaCodec codieren, indem Sie das Farbformat auf COLOR_FormatYUV420Flexible setzen. Mein Eingangspuffer des ist yuv420p.When I Eingangspuffer wie folgt aus:MediaCodec getInputImage gibt auf einigen Geräten null zurück

int inputBufferIndex = mEncoder.dequeueInputBuffer(-1); 
    mCurrentBufferIndex = inputBufferIndex; 
    if (inputBufferIndex >= 0) { 
     ByteBuffer inputBuffer = inputBuffers[inputBufferIndex]; 
     //if(VERBOSE) 
      Log.i(TAG,"pos:"+inputBuffer.position()+"\tlimit:"+inputBuffer.limit()); 
     inputBuffer.clear(); 
     return inputBuffer; 
    } 

Aber einige Geräte erhalten falsche Farbe. Also versuche ich dies:

int inputBufferIndex = mEncoder.dequeueInputBuffer(-1); 
    mCurrentBufferIndex = inputBufferIndex; 
    if (inputBufferIndex >= 0) { 
     Image img = mEncoder.getInputImage(inputBufferIndex); 
     if(img==null) 
      return null; 
     //mCurrentInputPlanes = img.getPlanes(); 
     ByteBuffer buffers[]={img.getPlanes()[0].getBuffer(), 
       img.getPlanes()[1].getBuffer(), 
       img.getPlanes()[2].getBuffer()}; 

ich den Puffer zu YUV Kanäle .Es Arbeit auf einigen Geräten zu füllen. Aber moto X pro und huawei P7 werden beim Aufruf von getInputImage null. Die Dokumentation besagt, dass das Bild keine Rohdaten enthält. Aber es erwähnt auch COLOR_FormatYUV420Flexible wird seit API 21.So wie soll ich das beheben.

+0

verarbeiten kann ich dies auf eine Menge bin immer von Galaxy Note3 und Galaxy Tab 4 10.1 Geräte, weitere Informationen von jedermann? – FTLRalph

+0

@FTLRalph Können Sie das vollständige Codebeispiel posten? Aus der Frage ist nicht ersichtlich, wie die YUV-Daten in den Eingabepuffer kopiert werden. Könnten Sie auch ein Beispiel des codierten Videos posten, das das Problem zeigt? Falsche Farben klingen für mich wie Stride- oder Padding-Probleme, benötigen aber mehr Informationen zum Debuggen. –

+0

Haben Sie überprüft, wurde COLOR_FormatYUV420Flexible unterstützt? nach diesem Link: https://stackoverflow.com/questions/30857610/will-all-phones-support-yuv-420-semi-planar-color-format-in-h-264-encoder – user1796260

Antwort

0

getInputImage Dokumentation sagt:

 * @return the input image, or null if the index is not a 
    * dequeued input buffer, or not a ByteBuffer that contains a 
    * raw image. 

oder kein ByteBuffer, die ein rohes Bild enthält. könnte bedeuten, dass das Bild das Farbformat nicht unterstützt. Nur weil COLOR_FormatYUV420Flexible seit 21 verfügbar ist, bedeutet das nicht, dass alle Codecs dieses Format unterstützen.

Wenn Sie unbedingt getInputImage verwenden müssen, dann versuchen Sie vielleicht:

  • COLOR_FormatYUV420Planar
  • COLOR_FormatYUV420SemiPlanar
  • einen anderen Codec, COLOR_FormatYUV420Flexible