Gracias por su atención!
Quiero usar Android MediaCodec Api para codificar el fotograma de vídeo que se adquirió de la Cámara,
por desgracia, no he éxito para hacer eso! Yo todavía no están familiarizados con el MediaCodec API。
El seguimiento es mis códigos,necesito de su ayuda para averiguar lo que debe hacer.

1、La configuración de la Cámara:

Parameters parameters = mCamera.getParameters();
parameters.setPreviewFormat(ImageFormat.NV21);
parameters.setPreviewSize(320, 240);
mCamera.setParameters(parameters);

2、Establecer el codificador:

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 >= 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-->" + outputBufferIndex);
do {
if (outputBufferIndex >= 0) {
ByteBuffer outBuffer = outputBuffers[outputBufferIndex];
System.out.println("buffer info-->" + 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 -- > " + 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 >= 0);
}

Supongo que el problema se produjo en el codificador método,el método será utilizado en la vista previa de la Cámara de devolución de llamada ,como

initCodec();
//mCamera.setPreviewCallback(new MyPreviewCallback());
mCamera.setPreviewCallback(new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
encode(data);
}
});

Sólo tengo ni idea de cómo hacerlo correctamente con el MediaCodec de la API.Me puedes dar algunos consejos o enlaces al respecto?

Gracias!

la utilizaste para grabar vídeo sin audio, me gustaría saber cómo usarlo con MediaMuxer para grabar audio y vídeo

OriginalEl autor Read Mark | 2013-06-21

2 Comentarios

  1. 7

    Me han resuelto el problema.Como sigue:

    private synchronized void encode(byte[] data)
    {
    inputBuffers = mMediaCodec.getInputBuffers();//here changes
    outputBuffers = mMediaCodec.getOutputBuffers();
    int inputBufferIndex = mMediaCodec.dequeueInputBuffer(-1);
    Log.i(TAG, "inputBufferIndex-->" + inputBufferIndex);
    //......

    Y,a continuación, usted encontrará su vídeo codificado con color no es el correcto, para obtener más información,por favor visite aquí MediaCodec y Cámara: espacios de color no coinciden

    tengo este error.¿cómo resolver este pblm….java.lang.NoClassDefFoundError: android.los medios de comunicación.MediaCodec error de señalar esta línea : mMediaCodec = MediaCodec.createEncoderByType(«video/avc»);
    Parece que intenta utilizar MediaCodec en Android con API < 16

    OriginalEl autor Read Mark

  2. 5

    La YUV420 los formatos de salida de la cámara son incompatibles con los formatos aceptados por el MediaCodec codificador AVC. En el mejor de los casos, es esencialmente NV12 vs NV21 (U y V los planos son a la inversa), que requieren de un manual de reordenación. En el peor de los casos, como el de Android 4.2, el codificador formato de entrada pueden ser específicos del dispositivo.

    Es mejor que use MediaRecorder para conectar el hardware de la cámara para el codificador.

    Actualización:
    Ahora es posible pasar de la cámara de la Superficie de la vista previa para MediaCodec, en lugar de utilizar la YUV datos en el ByteBuffer. Esto es más rápido y más portátil. Ver el CameraToMpegTest muestra aquí.

    Gracias por su ayuda.He grabado un video de archivo,pero el archivo de datos no es correcta.Los datos de partida, es de derecha,son h.264 marco de datos,sino sobre tres cuadros más tarde ,h.264 marco de datos están todos llenos de 0.Puede ser el archivo de búfer está mal,yo creo,pero no puede ser 0
    Hola, @fadden. Acerca de el «es mejor Que use MediaRecorder para conectar el hardware de la cámara para el codificador.», hay algún código de ejemplo para ti ? Gracias.
    MediaRecorder, la Superficie no permite el proceso de fotogramas antes de la grabación y por qué crees que es más rápido? Creo que el autor sabe acerca de MediaRecord pero como se puede ver le preguntó acerca de los cuadros de la cámara

    OriginalEl autor fadden

Dejar respuesta

Please enter your comment!
Please enter your name here