Как записать видео, которое уже транслируется на onPreviewFrame

Я разрабатываю приложение для Android, которое транслирует видео через TokBox. Я хочу записать потоковое видео. Для этого я попытался использовать пример MediaRecorder. Он отлично справился с записью видео, но я потерял свою трансляцию. Есть два основных класса Java, просто скажите A и B. Класс B реализует PreviewCallback, Вот onPreviewFrame метод. Если вы заинтересованы в TokBox, класс B расширяется BaseVideoCapturer,

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
    mPreviewBufferLock.lock();
    if (isCaptureRunning) {
        if (data.length == mExpectedFrameSize) {
            // Get the rotation of the camera
            int currentRotation = compensateCameraRotation(mCurrentDisplay
                    .getRotation());
            // Send frame to OpenTok
            provideByteArrayFrame(data, NV21, mCaptureWidth,
                    mCaptureHeight, currentRotation, isFrontCamera());

            // Reuse the video buffer
            camera.addCallbackBuffer(data);
        }
    }
    mPreviewBufferLock.unlock();
}

Класс A - это деятельность, которая управляет записью. Есть способ начать запись видео и остановить через 5 секунд.

public static boolean prepareAndStartMediaRecorder(){
    if(CustomVideoCapturer.isCaptureStarted){
        // BEGIN_INCLUDE (configure_media_recorder)
        mMediaRecorder = new MediaRecorder();
        // Step 1: Unlock and set camera to MediaRecorder
        B.mCamera.unlock();
        mediaRecorder.setCamera(B.mCamera);
        // Step 2: Set sources
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
        mMediaRecorder.setProfile(profile);
        // Step 4: Set output file
        mediaRecorder.setOutputFile("/sdcard/myvideo.mp4");
        mediaRecorder.setMaxDuration(60000); // Set max duration 60 sec.
        mediaRecorder.setMaxFileSize(5000000); // Set max file size 5M
        //configure preview
        mediaRecorder.setPreviewDisplay(mPreview.getSurfaceTexture());
        // Step 5: Prepare configured MediaRecorder
        try {
            mediaRecorder.prepare();
        } catch (IllegalStateException e) {
            releaseMediaRecorder();
            return false;
        } catch (IOException e) {
            releaseMediaRecorder();
            return false;
        }
        mediaRecorder.start();
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mediaRecorder.stop();  // stop the recording
            }
        }, 5000);
    }

После начала записи onPreviewFrame метод не вызывается. Есть ли у вас какое-либо решение этой проблемы или другой подход для одновременной записи и потокового видео?

Изменить 1: я пытался применить это решение, но оно не сработало. Если вы утверждаете, что это правильное решение, пожалуйста, сообщите мне.

Редактировать 2: API архивирования записывает потоковое мультимедиа, поэтому иногда оно бывает шумным. Мне нужно записывать кадры с камеры напрямую, чтобы получить качественное видео.

2 ответа

Если вы используете OpenTok и хотите записать кадр с камеры, самый простой подход - это создать Custom Capturer.

При использовании OpenTok Custom Capturer - это класс, который выбирает кадры из любого места (например, камеры) и передает их в OpenTok для потоковой передачи. Когда у вас есть кадры, вы можете записать их и отправить в виде потока OpenTok. Для получения дополнительной информации см. Руководство разработчика о пользовательских устройствах захвата.

Пожалуйста, посмотрите на образец пользовательского видео драйвера для более подробной информации.

Вот код, где вы можете получить кадр и создать запись, используя что-то вроде MediaCodec учебный класс.

Сотрудники OpenTok QA здесь,

Если вы хотите записать содержимое сеанса, включая аудио и видео от всех участников, вы можете использовать API архивации, предоставляемый OpenTok.

https://tokbox.com/developer/rest/

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