如何录制已经在onPreviewFrame

时间:2018-07-05 13:10:19

标签: android video-streaming android-camera opentok android-video-record

我开发了一个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:我尝试应用此solution,但没有成功。如果您声称这是正确的解决方案,请通知我。

编辑2:归档API记录了流媒体,因此有时会有噪音。我需要直接从相机录制帧以获取高质量的视频。

2 个答案:

答案 0 :(得分:1)

如果您使用的是OpenTok,并且想从相机记录帧,最简单的方法是构建自定义捕获器。

使用OpenTok时,“自定义捕获器”是一个类,它可以从任何地方(例如,相机)获取帧并将其馈送到OpenTok进行流处理。拥有框架后,就可以录制它们并将其作为OpenTok流发送。有关更多详细信息,请参见developer guide about custom capturers

请查看custom video driver sample了解更多详细信息。

Here is the code,您可以在其中使用MediaCodec类之类的东西来获取帧并创建记录。

答案 1 :(得分:0)

OpenTok质量检查人员在这里

如果要记录会话的内容,包括来自所有参与者的音频和视频,则可以使用OpenTok提供的存档API。

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