2016-06-16 25 views
21

Desidero codificare utilizzando MediaCodec impostando il formato colore su COLOR_FormatYUV420Flexible. mio tampone di ingresso è buffer di input yuv420p.When Mi piace questo:MediaCodec getInputImage restituisce null su alcuni dispositivi

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; 
    } 

Ma alcuni dispositivi ottenere colore sbagliato. Così provo questo:

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()}; 

ho riempire il buffer per i canali YUV lavoro .E su alcuni dispositivi. Ma moto X pro e huawei P7 diventano nulli quando si chiama getInputImage. La documentazione dice che l'immagine non contiene dati grezzi. Ma menziona anche COLOR_FormatYUV420Flexible è supportato dall'API 21. Quindi come dovrei risolvere questo.

+0

sto ottenendo questo su un terreno dei dispositivi Galaxy Note 3 e Galaxy Tab 4 10.1, ulteriori informazioni da chiunque? – FTLRalph

+0

@FTLRalph Potresti postare un esempio di codice completo? Dalla domanda non è chiaro come i dati YUV siano copiati nell'inputbuffer. Inoltre, potresti pubblicare un esempio del video codificato che mostra il problema? Il colore sbagliato suona come il problema del passo o del rivestimento, ma ho bisogno di più informazioni per eseguire il debug. –

+0

Hai verificato che fosse supportato COLOR_FormatYUV420Flessibile? in base a questo link: https://stackoverflow.com/questions/30857610/will-all-phones-support-yuv-420-semi-planar-color-format-in-h-264-encoder – user1796260

risposta

0

getInputImage documentazione dice:

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

o meno di una ByteBuffer che contiene un'immagine RAW. potrebbe significare che l'immagine non supporta il formato colore. Solo perché COLOR_FormatYUV420Flexible è disponibile dal 21, non significa che tutti i codec supportano questo formato.

Se è assolutamente necessario utilizzare getInputImage, poi magari provare:

  • COLOR_FormatYUV420Planar
  • COLOR_FormatYUV420SemiPlanar
  • un codec diverso in grado di gestire COLOR_FormatYUV420Flexible