samsung - Crear video desde capturas de pantalla en Android
como hacer una captura de pantalla en el celular (1)
Me gustaría registrar la interacción del usuario en un video que las personas pueden luego subir a sus sitios de redes sociales.
Por ejemplo, la aplicación de Android Talking Tom Cat tiene un pequeño ícono de videocámara. El usuario puede presionar el ícono de la videocámara, luego interactuar con la aplicación, presionar el ícono para detener la grabación y luego el video se procesa / convierte listo para cargar.
Creo que puedo usar setDrawingCacheEnabled (true) para guardar imágenes pero no sé cómo agregar audio o hacer un video.
Actualización: Después de leer más, creo que tendré que usar NDK y ffmpeg. Prefiero no hacer esto, pero, si no hay otras opciones, ¿alguien sabe cómo hacer esto?
¿Alguien sabe cómo hacer esto en Android?
Enlaces relevantes ...
Pantalla Android capturando o creando videos a partir de imágenes
¿Cómo grabar video de pantalla como lo hace la aplicación Talking Tomcat en iphone?
Utilice la API MediaCodec con CONFIGURE_FLAG_ENCODE
para configurarlo como un codificador. No se requiere ffmpeg :)
Ya ha encontrado cómo capturar la pantalla en la otra pregunta a la que se vinculó, ahora solo necesita alimentar cada cuadro capturado a MediaCodec
, estableciendo los indicadores de formato apropiados, la marca de tiempo, etc.
EDITAR: código de ejemplo para esto fue difícil de encontrar, pero aquí está , punta de sombrero para Martin Storsjö. Guía rápida de API:
MediaFormat inputFormat = MediaFormat.createVideoFormat("video/avc", width, height);
inputFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
inputFormat.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
inputFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
inputFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 75);
inputFormat.setInteger("stride", stride);
inputFormat.setInteger("slice-height", sliceHeight);
encoder = MediaCodec.createByCodecName("OMX.TI.DUCATI1.VIDEO.H264E"); // need to find name in media codec list, it is chipset-specific
encoder.configure(inputFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
encoder.start();
encoderInputBuffers = encoder.getInputBuffers();
encoderOutputBuffers = encoder.getOutputBuffers();
byte[] inputFrame = new byte[frameSize];
while ( ... have data ... ) {
int inputBufIndex = encoder.dequeueInputBuffer(timeout);
if (inputBufIndex >= 0) {
ByteBuffer inputBuf = encoderInputBuffers[inputBufIndex];
inputBuf.clear();
// HERE: fill in input frame in correct color format, taking strides into account
// This is an example for I420
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
inputFrame[ i * stride + j ] = ...; // Y[i][j]
inputFrame[ i * stride/2 + j/2 + stride * sliceHeight ] = ...; // U[i][j]
inputFrame[ i * stride/2 + j/2 + stride * sliceHeight * 5/4 ] = ...; // V[i][j]
}
}
inputBuf.put(inputFrame);
encoder.queueInputBuffer(
inputBufIndex,
0 /* offset */,
sampleSize,
presentationTimeUs,
0);
}
int outputBufIndex = encoder.dequeueOutputBuffer(info, timeout);
if (outputBufIndex >= 0) {
ByteBuffer outputBuf = encoderOutputBuffers[outputBufIndex];
// HERE: read get the encoded data
encoder.releaseOutputBuffer(
outputBufIndex,
false);
}
else {
// Handle change of buffers, format, etc
}
}
También hay algunos problemas abiertos .
EDITAR: alimentaría los datos como un búfer de bytes en uno de los formatos de píxeles admitidos, por ejemplo, I420 o NV12. Desafortunadamente, no existe una manera perfecta de determinar qué formatos funcionarían en un dispositivo en particular; sin embargo, es típico que los mismos formatos que puede obtener de la cámara para trabajar con el codificador.