Создание видео с экрана в андроиде

Я хотел бы записать взаимодействие пользователя в видео, которое люди могут загрузить на свои сайты в социальных сетях.

Например, приложение Android Talking Tom Cat имеет небольшой значок видеокамеры. Пользователь может нажать значок видеокамеры, затем взаимодействовать с приложением, нажать значок, чтобы остановить запись, и затем видео обрабатывается / конвертируется в готовность к загрузке.

Я думаю, что я могу использовать setDrawingCacheEnabled (true) для сохранения изображений, но не знаю, как добавить аудио или сделать видео.

Обновление: после дальнейшего чтения, я думаю, мне нужно будет использовать NDK и ffmpeg. Я предпочитаю не делать этого, но, если нет других вариантов, кто-нибудь знает, как это сделать?

Кто-нибудь знает, как это сделать в Android?

Соответствующие ссылки …

Захват экрана Android или создание видео с изображений

Как записывать видео на экране, как будто Talking приложение Tomcat работает в iphone?

Используйте MediaCodec API с CONFIGURE_FLAG_ENCODE чтобы настроить его как кодировщик. Не требуется ffmpeg 🙂

Вы уже нашли, как захватить экран в другом вопросе, к MediaCodec вы привязались, теперь вам нужно только подавать каждый захваченный кадр в MediaCodec , устанавливая соответствующие флаги формата, временную метку и т. Д.

EDIT: Образец кода для этого было трудно найти, но вот он , шляпа совет Мартин Storsjö. Краткое руководство по 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 } } 

Есть также некоторые открытые проблемы .

EDIT: вы будете подавать данные в виде байтового буфера в один из поддерживаемых форматов пикселей, например I420 или NV12. К сожалению, нет идеального способа определить, какие форматы будут работать на определенном устройстве; Однако это типично для тех же форматов, которые вы можете получить с камеры для работы с кодировщиком.