- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我开发了一个 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/
我是一名优秀的程序员,十分优秀!