【发布时间】:2016-01-09 22:53:52
【问题描述】:
我的项目中有一个需求,就是录制视频并上传到服务器,但由于移动网络不可靠,一开始我决定每 30 秒一次
停止记录器
重置录音机状态
检索记录器写入的文件并在不同的线程中上传(多部分表单数据)。
根据当前时间戳的哈希将记录器的输出文件更改为新文件。
每 30 秒重复一次处理
这样做非常适合我的需求,因为每个 30 秒的视频文件大小都不超过 1MB,并且上传顺利。
但我面临的问题是,每次媒体记录器停止并重新启动时,都会有大约 500 毫秒的延迟,所以我在服务器上收到的视频每 30 秒就会中断 500 毫秒,这对我目前的情况来说真的很糟糕情况,所以我在想是否可以只更改记录器正在写入的文件?
相关代码:
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;
}
【问题讨论】:
-
能否提供代码?
-
赞成,因为这是一个有趣的问题。我认为您可能不需要在录制时保存到多个文件中。你应该在录制完成后分开。
-
没有我在录制期间拆分的原因是因为我想在视频录制时上传块,这样我在录制期间上传小块,最终在提交最后一个块时用户看到的上传时间非常短
标签: java android c++ native-code