Медиа-проекция Android создает пустой файл фильма

Я пытаюсь создать простое приложение для скринкаста, которое будет захватывать экран и сохранять его в файл фильма. До сих пор мое приложение производило только пустые файлы фильмов (черный экран) правильной длины и размера. Я не уверен, что это помогает, но когда я запускаю приложение, я получаю эти сообщения в logcat

08-29 14:47:57.722    1973-1991/com.example.stw.myapplication W/EGL_emulation﹕ eglSurfaceAttrib not implemented
08-29 14:47:57.722    1973-1991/com.example.stw.myapplication W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xabdbee60, error=EGL_SUCCESS
08-29 14:47:58.870    1973-1991/com.example.stw.myapplication E/Surface﹕ getSlotFromBufferLocked: unknown buffer: 0xab659760
08-29 14:47:58.875    1973-1991/com.example.kamil.myapplication D/OpenGLRenderer﹕ endAllStagingAnimators on 0xab32c580 (ListPopupWindow$DropDownListView) with handle 0xa333d8d0
08-29 14:48:00.652    1973-1973/com.example.kamil.myapplication D/MPEG4Writer﹕ Video track stopping
08-29 14:48:00.652    1973-1973/com.example.kamil.myapplication D/MPEG4Writer﹕ Video track source stopping
08-29 14:48:00.652    1973-1973/com.example.kamil.myapplication D/MPEG4Writer﹕ Video track source stopped

Кроме этого сообщения кажутся неактуальными. Я выложу часть кода, может быть, это поможет. Я получаю поверхность

mInputSurface = mVideoEncoder.createInputSurface();

Итак, я создаю виртуальный дисплей:

        mMediaProjection.createVirtualDisplay("Recording Display", screenWidth,
            screenHeight, screenDensity, 0 /* flags */, mInputSurface,
            null /* callback */, null /* handler */);

Затем этот метод вызывается:

    private void prepareVideoEncoder() {
    mVideoBufferInfo = new MediaCodec.BufferInfo();
    MediaFormat format = MediaFormat.createVideoFormat(VIDEO_MIME_TYPE, VIDEO_WIDTH, VIDEO_HEIGHT);
    int frameRate = 30; // 30 fps

    // Set some required properties. The media codec may fail if these aren't defined.
    format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
            MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
    format.setInteger(MediaFormat.KEY_BIT_RATE, 6000000); // 6Mbps
    format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
    format.setInteger(MediaFormat.KEY_CAPTURE_RATE, frameRate);
    format.setInteger(MediaFormat.KEY_REPEAT_PREVIOUS_FRAME_AFTER, 1000000 / frameRate);
    format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
    format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1); // 1 seconds between I-frames

    // Create a MediaCodec encoder and configure it. Get a Surface we can use for recording into.
    try {
        mVideoEncoder = MediaCodec.createEncoderByType(VIDEO_MIME_TYPE);
        mVideoEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
        mInputSurface = mVideoEncoder.createInputSurface();
        mVideoEncoder.start();
    } catch (IOException e) {
        releaseEncoders();
    }
}

Затем, когда пользователь нажимает кнопку "Остановить запись", я выпускаю кодировщики, как показано ниже:

    private void releaseEncoders() {
    mDrainHandler.removeCallbacks(mDrainEncoderRunnable);
    if (mMuxer != null) {
        if (mMuxerStarted) {
            mMuxer.stop();
        }
        mMuxer.release();
        mMuxer = null;
        mMuxerStarted = false;
    }
    if (mVideoEncoder != null) {
        mVideoEncoder.stop();
        mVideoEncoder.release();
        mVideoEncoder = null;
    }
    if (mInputSurface != null) {
        mInputSurface.release();
        mInputSurface = null;
    }
    if (mMediaProjection != null) {
        mMediaProjection.stop();
        mMediaProjection = null;
    }
    mVideoBufferInfo = null;
    mDrainEncoderRunnable = null;
    mTrackIndex = -1;
}

Спасибо за помощь. Надеюсь, вы, ребята, сможете найти то, что я пропустил.

0 ответов

Другие вопросы по тегам