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

标签 android post video send mediarecorder

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

  1. 开始录音;
  2. 读取部分视频文件到字节数组;
  3. 通过 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/

相关文章:

Android 小部件在模拟器中运行良好,但在手机上它变成了 Google App 小部件

Android onSearchRequested() 回调到调用 Activity

iphone - 使用 UIImagePickerController 录制视频

在 Raspberry Pi 上播放 Android Things 视频

css - 调整 Squarespace 标题图像容器的大小不会调整内部图像的大小

java - 在拖动/重新排序期间调整 itemTouchhelper 上所有 recyclerview 单元格的大小

java - 如何在 WebView 中保存和加载 HTML 图片?

jQuery 提交在 url 中加载表单数据,但不会发布到 ColdFusion cfc

java - 使用java发送文件以形成帖子

javascript - 通过 AJAX POST 发送 URI 数据