android - 如何录制已经在 onPreviewFrame 上流式传输的视频

标签 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 类是管理记录的 Activity 。有一种开始录像并在 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 记录流媒体,所以有时会有噪音。我需要直接从相机记录帧以获得高质量视频。

最佳答案

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

当使用 OpenTok 时,Custom Capturer 是一个类,它从任何地方(例如相机)获取帧并将它们提供给 OpenTok 进行流式传输。获得帧后,您可以记录它们并将它们作为 OpenTok 流发送。有关详细信息,请参阅 developer guide about custom capturers .

请看custom video driver sample了解更多详情。

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

关于android - 如何录制已经在 onPreviewFrame 上流式传输的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51192192/

相关文章:

video-streaming - 混合内容与 hls.js

php - 哪些网络视频格式可以做到这一点?

objective-c - 在 UICollectionView 上使用 AVPlayer 和 AVPlayerLayer 显示多个视频

Android - 捕获图像后更新文件夹显示

java - 如何在三星 Galaxy 设备上同时打开前置和后置摄像头?

android - 如何使用Android MediaCodec编码Camera数据(YUV420sp)

android - onGlobalLayoutListener 与 postRunnable

java - 如何在android中将毫秒转换为日期格式?

android - 如何在 Android Studio 中打开 Gradle 项目(修复 "gradle sync fails error")——打开 zip 文件时出错

java - 如何从 Activity 导航到 NavigationDrawer 中的特定 fragment