我正在开发一个在后台录制视频并通过读取字节并将它们存储在字节数组中将其部分发送到服务器的应用程序。目前算法非常简单:
- 开始录音;
- 读取部分视频文件到字节数组;
- 通过 POST 发送字节数组(在改进的帮助下)。
如果连接以某种方式中断并且最后一部分未发送,则会出现问题。服务器无法制作可读的视频文件,因为只有在录制停止后才会写入 moov 原子。我的问题 - 是否有可能从字节数组部分或任何其他方式制作完整的视频文件?如果可以解决问题,我可以更改视频编解码器。 附:我只能通过 POST 发送数据。 p.p.s 我无法在服务器端更改某些内容,包括将视频直接流式传输到服务器。
最佳答案
解决方案
我决定以递归方式录制小块视频。下一个解决方案适用于第一个版本的 Camera API。如果您使用的是 Camera2 或其他东西 - 您可以尝试使用相同的算法。
在录制视频的服务类中,确保 mediarecorder 的配置如下:
mediaRecorder.setMaxDuration(10000);
//or
mMediaRecorder.setMaxFileSize(10000);
接下来需要实现setOnInfoListener接口(interface):
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);
}
}
});
不要忘记为下一次迭代传递 surfaceHolder 实例,否则您会收到“应用程序丢失表面”错误。
接下来您需要做的是在 onCreate 方法中声明 FileObserver:
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);
}
}
};
在 onStartCommand 方法中:
fileObserver.startWatching();
关于android - 如何在录制时发送 mp4 的可读部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40040490/