Я разрабатываю приложение для Android, которое транслирует видео через TokBox . Я хочу записать потоковое видео. Для этого я попытался использовать MediaRecorder sample. Он отлично справился с записью видео, но я потерял стрим. Есть два основных 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 архивирования записывает потоковое мультимедиа, поэтому иногда оно имеет шум. Мне нужно записывать кадры с камеры напрямую, чтобы получить высококачественное видео.