Как записать видео, которое уже транслируется на onPreviewFrame
Я разрабатываю приложение для 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: я пытался применить это решение, но оно не сработало. Если вы утверждаете, что это правильное решение, пожалуйста, сообщите мне.
Редактировать 2: API архивирования записывает потоковое мультимедиа, поэтому иногда оно бывает шумным. Мне нужно записывать кадры с камеры напрямую, чтобы получить качественное видео.
2 ответа
Если вы используете OpenTok и хотите записать кадр с камеры, самый простой подход - это создать Custom Capturer.
При использовании OpenTok Custom Capturer - это класс, который выбирает кадры из любого места (например, камеры) и передает их в OpenTok для потоковой передачи. Когда у вас есть кадры, вы можете записать их и отправить в виде потока OpenTok. Для получения дополнительной информации см. Руководство разработчика о пользовательских устройствах захвата.
Пожалуйста, посмотрите на образец пользовательского видео драйвера для более подробной информации.
Вот код, где вы можете получить кадр и создать запись, используя что-то вроде MediaCodec
учебный класс.
Сотрудники OpenTok QA здесь,
Если вы хотите записать содержимое сеанса, включая аудио и видео от всех участников, вы можете использовать API архивации, предоставляемый OpenTok.