我正在开发一个在后台录制视频的应用程序,通过读取字节并将它们存储在字节数组中,将其部分发送到服务器。现在算法非常简单:
如果连接以某种方式中断并且未发送最后一部分,则会出现问题。服务器只是不能制作可读的视频文件,因为只有在录制停止后才能写入moov原子。我的问题 - 是否有可能如何从字节数组部分或任何其他方式制作完整的视频文件?如果可以解决问题,我可以更改视频编解码器。 附:我只能通过POST发送数据。 p.p.s我无法在服务器端更改某些内容,包括直接将视频流式传输到服务器。
答案 0 :(得分:1)
<强>解强>
我决定以递归方式录制小块视频。下一个解决方案适用于Camera API的第一个版本。如果你正在使用Camera2或其他东西 - 你可以尝试使用相同的算法。
在记录视频的服务类中,确保下一步配置了mediarecorder:
colspan
然后你需要在下一步实现setOnInfoListener接口:
mediaRecorder.setMaxDuration(10000);
//or
mMediaRecorder.setMaxFileSize(10000);
不要忘记为下一次迭代传递surfaceHolder实例,否则你会得到&#34;应用程序丢失表面&#34;错误。
接下来你需要做的是在onCreate方法中声明FileObserver:
mediaRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {
//Use next condition if you decided to use max file size
//if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED)
stopRecording();
setRecordingStatus(false);
startRecording(surfaceHolder);
}
}
});
在onStartCommand方法中:
FileObserver fileObserver = new FileObserver(pathToFolder, FileObserver.CLOSE_WRITE) {
//FileObserver.CLOSE_WRITE mask means that this observer would be triggered when it receive end of writing to file system event
@Override
public void onEvent(int event, String path) {
//here path is name of file (with extension) but not the full path to file
if (event == FileObserver.CLOSE_WRITE && path.endsWith(".mp4")) {
String name = String.valueOf(Long.parseLong(path.substring(0, path.length() - 4)) / 1000);
sendNewVideo(pathToFolder + "/" + path, name);
}
}
};