如何在录制时发送mp4的可读部分

时间:2016-10-14 10:07:15

标签: android post video send mediarecorder

我正在开发一个在后台录制视频的应用程序,通过读取字节并将它们存储在字节数组中,将其部分发送到服务器。现在算法非常简单:

  1. 开始录制;
  2. 将部分视频文件读取到字节数组;
  3. 通过POST发送字节数组(在改造的帮助下)。
  4. 如果连接以某种方式中断并且未发送最后一部分,则会出现问题。服务器只是不能制作可读的视频文件,因为只有在录制停止后才能写入moov原子。我的问题 - 是否有可能如何从字节数组部分或任何其他方式制作完整的视频文件?如果可以解决问题,我可以更改视频编解码器。 附:我只能通过POST发送数据。 p.p.s我无法在服务器端更改某些内容,包括直接将视频流式传输到服务器。

1 个答案:

答案 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);
                }

            }
};