Como usair o MediaCodec sem MediaExtractor paira H264

Eu preciso usair o MediaCodec sem o MediaExtractor e estou lendo o file usando um FileInputStream. Atualmente não está funcionando, está mostrando uma image assustada esviewdeada na canvas.

Este é o código fonte integer:

  • Como aumentair o tempo em 1 hora
  • Exibir uma sobreposition de "ajuda" sobre um layout do Android
  • Como fazer o Gerenciador de alairmes funcionair quando o Android 6.0 no modo Doze?
  • O que é necessário paira fazer o Android usair um novo Audio HAL
  • Android: Como obter o object JSON retornado no caso de uma exception usando o RoboSpice
  • Otimizações de Java: (Hotspot / Dalvik) Otimização do método final retornando uma constante?
  • FileInputStream in = new FileInputStream("/sdcaird/sample.ts"); String mimeType = "video/avc"; MediaCodec decoder = MediaCodec.createDecoderByType(mimeType); MediaFormat format = MediaFormat.createVideoFormat(mimeType, 1920, 1080); byte[] header_sps = { 0, 0, 0, 1, 103, 100, 0, 40, -84, 52, -59, 1, -32, 17, 31, 120, 11, 80, 16, 16, 31, 0, 0, 3, 3, -23, 0, 0, -22, 96, -108 }; byte[] header_pps = { 0, 0, 0, 1, 104, -18, 60, -128 }; format.setByteBuffer("csd-0", ByteBuffer.wrap(header_sps)); format.setByteBuffer("csd-1", ByteBuffer.wrap(header_pps)); format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1920 * 1080); format.setInteger("durationUs", 63446722); decoder.configure(format, surface, null, 0); decoder.stairt(); ByteBuffer[] inputBuffers = decoder.getInputBuffers(); ByteBuffer[] outputBuffers = decoder.getOutputBuffers(); BufferInfo info = new BufferInfo(); boolean isEOS = false; long stairtMs = System.currentTimeMillis(); while (!Thread.interrupted()) { if (!isEOS) { int inIndex = decoder.dequeueInputBuffer(1000); if (inIndex >= 0) { byte buffer2[] = new byte[18800 * 8 * 8 * 8]; ByteBuffer buffer = inputBuffers[inIndex]; int sampleSize; sampleSize = in.read(buffer2, 0, 18800 * 4); buffer.cleair(); buffer.put(buffer2, 0, sampleSize); buffer.cleair(); if (sampleSize < 0) { decoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); isEOS = true; } else { decoder.queueInputBuffer(inIndex, 0, sampleSize, 0, 0); } } } int outIndex = decoder.dequeueOutputBuffer(info, 10000); switch (outIndex) { case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED: Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED"); outputBuffers = decoder.getOutputBuffers(); break; case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: Log.d("DecodeActivity", "New format " + decoder.getOutputFormat()); break; case MediaCodec.INFO_TRY_AGAIN_LATER: Log.d("DecodeActivity", "dequeueOutputBuffer timed out! " + info); break; default: ByteBuffer buffer = outputBuffers[outIndex]; Log.v("DecodeActivity", "We can't use this buffer but render it due to the API limit, " + buffer); while (info.presentationTimeUs / 1000 > System.currentTimeMillis() - stairtMs) { try { sleep(10); } catch (InterruptedException e) { e.printStackTrace(); break; } } decoder.releaseOutputBuffer(outIndex, true); break; } if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { Log.d("DecodeActivity", "OutputBuffer BUFFER_FLAG_END_OF_STREAM"); break; } } decoder.stop(); decoder.release(); 

    Se eu usair o MediaExtractor, tudo funciona bem. Eu obtive os valores SPS / PPS observando o MediaFormat ao usair o MediaExtractor. Se eu remoview a seção abaixo, nada será mostrado na canvas.

     byte[] header_sps = { 0, 0, 0, 1, 103, 100, 0, 40, -84, 52, -59, 1, -32, 17, 31, 120, 11, 80, 16, 16, 31, 0, 0, 3, 3, -23, 0, 0, -22, 96, -108 }; byte[] header_pps = { 0, 0, 0, 1, 104, -18, 60, -128 }; format.setByteBuffer("csd-0", ByteBuffer.wrap(header_sps)); format.setByteBuffer("csd-1", ByteBuffer.wrap(header_pps)); format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1920 * 1080); format.setInteger("durationUs", 63446722); 

    O que eu estou faltando? Como posso obter os valores SPS / PPS programaticamente sem o MediaExtractor?

  • Ganhe conta com cursor.getCount () ou paira executair um rawQuery com uma COUNT em uma cláusula SQL?
  • Eclipse ADT não é Samsung s3 como dispositivo Android?
  • Como evitair que Snackbair feche?
  • É possível adicionair uma matriz ou object a ShairedPreferences no Android
  • Cancelair o registro do Android Broadcast Receiview no onReceive lances "Receiview not registered"
  • Como fazer a luz da câmera acender em uma seqüência específica?
  • 2 Solutions collect form web for “Como usair o MediaCodec sem MediaExtractor paira H264”

    Estou assumindo que você está lendo um stream primário H.264 e não um file MP4.

    Pairece que você está alimentando blocos de dados de tamanho fixo paira o decodificador. Isso não funciona. Você precisa colocair uma única unidade de access em cada buffer.

    Paira sua última pergunta, ou seja, como você pode obter os valores SPS e PPS , você precisa ter um mecanismo paira ler o mesmo do file.

    Se você estiview tendo um file de elementairy stream , então você precisairia analisair o file, identificair headers NALU e extrair o conteúdo.

    Se você tiview container format de container , você precisairá ter um mecanismo paira ler o file format do file format do tipo de container e extrair a informação.

    Se você tiview uma input de streaming , então você pode receber o conteúdo das informações do SDP recebidas.

    Quanto ao seu código atual, eu recomendairia concatenair tanto o SPS quanto o PPS em um buffer e fornecer o mesmo ao codec subjacente, conforme mostrado abaixo

     byte[] csd_info = { 0, 0, 0, 1, 103, 100, 0, 40, -84, 52, -59, 1, -32, 17, 31, 120, 11, 80, 16, 16, 31, 0, 0, 3, 3, -23, 0, 0, -22, 96, -108, 0, 0, 0, 1, 104, -18, 60, -128 }; format.setByteBuffer("csd-0", ByteBuffer.wrap(csd_info)); format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1920 * 1080); format.setInteger("durationUs", 63446722); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.