如何在不停止媒体logging器的情况下更改媒体logging器的输出文件

我的项目有一个要求,那就是video正在录制并上传到服务器上,但是由于移动networking不可靠,所以我决定每隔30秒就要做一次

由于每个30秒的video文件大小不超过1MB,并且上传顺利进行,因此完全适合我的需求。

但是我面对的问题是,每次媒体logging器停止和重新开始,都有500毫秒的延迟,所以我在服务器上收到的video每隔30秒就会有这500毫秒的时间,这对我现在的情况来说是非常糟糕的。我正在考虑是否可以更改logging器正在写入的文件?

相关代码:

GenericCallback onTickListener = new GenericCallback() { @Override public void execute(Object data) { int timeElapsedInSecs = (int) data; if (timeElapsedInSecs % pingIntervalInSecs == 0) { new API(getActivity().getApplicationContext()).pingServer(objInterviewQuestion.getCurrentAccessToken(), new NetworkCallback() { @Override public void execute(int response_code, Object result) { // TODO: HANDLE callback } }); } if (timeElapsedInSecs % uploadIntervalInSecs == 0 && timeElapsedInSecs < maxTimeInSeconds) { if (timeElapsedInSecs / uploadIntervalInSecs >= 1) { if(stopAndResetRecorder()) { openConnectionToUploadQueue(); uploadQueue.add( new InterviewAnswer(0, objInterviewQuestion.getQid(), objInterviewQuestion.getAvf(), objInterviewQuestion.getNext(), objInterviewQuestion.getCurrentAccessToken())); objInterviewQuestion.setAvf(MiscHelpers.getOutputMediaFilePath()); initializeAndStartRecording(); } } } } }; 

这里是initializeAndStartRecording()

 private boolean initializeAndStartRecording() { Log.i("INFO", "initializeAndStartRecording"); if (mCamera != null) { try { mMediaRecorder = CameraHelpers.initializeRecorder(mCamera, mCameraPreview, desiredVideoWidth, desiredVideoHeight); mMediaRecorder.setOutputFile(objInterviewQuestion.getAvf()); mMediaRecorder.prepare(); mMediaRecorder.start(); img_recording.setVisibility(View.VISIBLE); is_recording = true; return true; } catch (Exception ex) { MiscHelpers.showMsg(getActivity(), getString(R.string.err_cannot_start_recorder), AppMsg.STYLE_ALERT); return false; } } else { MiscHelpers.showMsg(getActivity(), getString(R.string.err_camera_not_available), AppMsg.STYLE_ALERT); return false; } } 

这里是stopAndResetRecorder

 boolean stopAndResetRecorder() { boolean success = false; try { if (mMediaRecorder != null) { try { //stop recording mMediaRecorder.stop(); mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; Log.d("MediaRecorder", "Recorder Stopped"); success = true; } catch (Exception ex) { if(ex != null && ex.getMessage()!=null && ex.getMessage().isEmpty()){ Crashlytics.log(Log.ERROR, "Failed to stop MediaRecorder", ex.getMessage()); Crashlytics.logException(ex); } success = false; } finally { mMediaRecorder = null; is_recording = false; is_recording = false; } } } catch (Exception ex) { success = false; } Log.d("MediaRecorder", "Success = " + String.valueOf(success)); return success; } 

Solutions Collecting From Web of "如何在不停止媒体logging器的情况下更改媒体logging器的输出文件"

您可以通过不调用release()方法以及在stopAndResetRecorder()执行的所有其他销毁(请参阅MediaRecorder状态机的文档)来稍微加快速度 。 您也不需要同时调用stop()reset()

您可以改为执行reset()然后调用initializeAndStartRecording()的中间resetRecorder()函数。 当你完成你所有的录音时,你可以调用stopRecorder()来执行破坏你的mMediaRecorder

正如我所说,这会节省您一些时间,但是,您现在已经销毁和重新初始化MediaRecorder的额外开销是否是我不知道的延迟的重要部分。 试一试,如果它不能解决你的问题,我会有兴趣知道它有多less时间/没有保存。

在我看来,setOutputFile调用一个关于MediaRecorder的源代码的本地方法,所以我不认为有一个简单的方法来同时写入单独的文件。

如何上传最后一个块,但允许用户在开始上传过程后做任何事情? 然后,用户不会注意到上传需要多长时间,并且可以在上传成功/失败时通知他。

[编辑:]尝试将上传stream传输到服务器,在那里服务器执行分块机制来分离文件。 在这里你可以有一个简单的解释如何做到这一点。

显然MediaRecorder.setOutputFile()也接受一个FileDescriptor

所以,如果你在低级别编程(JNI),你可能已经把一个进程的inputstream表示为一个文件描述符,并且当这个进程需要时写入不同的文件。 但是,这将涉及到从Javapipe理本地“路由器”进程。

不幸的是,在Java API方面,你运气不好。