Как записать видео, которое уже транслируется на onPreviewFrame - PullRequest
0 голосов
/ 05 июля 2018

Я разрабатываю приложение для Android, которое транслирует видео через TokBox . Я хочу записать потоковое видео. Для этого я попытался использовать MediaRecorder sample. Он отлично справился с записью видео, но я потерял стрим. Есть два основных 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 ]

0 голосов
/ 20 июля 2018

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

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

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

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

0 голосов
/ 06 июля 2018

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

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

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

...