我开发了一个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记录了流媒体,因此有时会有噪音。我需要直接从相机录制帧以获取高质量的视频。
答案 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。