Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to use Android MediaCodec encode Camera data(YUV420sp)
    primarykey
    data
    text
    <p>Thank you for your focus! I want to use Android MediaCodec APIs to encode the video frame which aquired from Camera, unfortunately, I have not success to do that! I still not familiar with the MediaCodec API。 The follow is my codes,I need your help to figure out what I should do.</p> <p>1、The Camera setting:</p> <pre><code>Parameters parameters = mCamera.getParameters(); parameters.setPreviewFormat(ImageFormat.NV21); parameters.setPreviewSize(320, 240); mCamera.setParameters(parameters); </code></pre> <p>2、Set the encoder:</p> <pre><code>private void initCodec() { try { fos = new FileOutputStream(mVideoFile, false); } catch (FileNotFoundException e) { e.printStackTrace(); } mMediaCodec = MediaCodec.createEncoderByType("video/avc"); MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 320, 240); mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000); mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15); mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5); mMediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); mMediaCodec.start(); inputBuffers = mMediaCodec.getInputBuffers(); outputBuffers = mMediaCodec.getOutputBuffers(); } private void encode(byte[] data) { int inputBufferIndex = mMediaCodec.dequeueInputBuffer(0); if (inputBufferIndex &gt;= 0) { ByteBuffer inputBuffer = inputBuffers[inputBufferIndex]; inputBuffer.clear(); inputBuffer.put(data); mMediaCodec.queueInputBuffer(inputBufferIndex, 0, data.length, 0, 0); } else { return; } MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0); Log.i(TAG, "outputBufferIndex--&gt;" + outputBufferIndex); do { if (outputBufferIndex &gt;= 0) { ByteBuffer outBuffer = outputBuffers[outputBufferIndex]; System.out.println("buffer info--&gt;" + bufferInfo.offset + "--" + bufferInfo.size + "--" + bufferInfo.flags + "--" + bufferInfo.presentationTimeUs); byte[] outData = new byte[bufferInfo.size]; outBuffer.get(outData); try { if (bufferInfo.offset != 0) { fos.write(outData, bufferInfo.offset, outData.length - bufferInfo.offset); } else { fos.write(outData, 0, outData.length); } fos.flush(); Log.i(TAG, "out data -- &gt; " + outData.length); mMediaCodec.releaseOutputBuffer(outputBufferIndex, false); outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0); } catch (IOException e) { e.printStackTrace(); } } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) { outputBuffers = mMediaCodec.getOutputBuffers(); } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { MediaFormat format = mMediaCodec.getOutputFormat(); } } while (outputBufferIndex &gt;= 0); } </code></pre> <p>I guess the problem occurred in the encoder method,the method will be used in the Camera Preview Callback ,like</p> <pre><code>initCodec(); //mCamera.setPreviewCallback(new MyPreviewCallback()); mCamera.setPreviewCallback(new PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { encode(data); } }); </code></pre> <p>I just have no idea how to do it correctly with the MediaCodec API.Can you give me some advice or links about it?</p> <p>Thank you!</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload