【问题标题】:How to pause/resume the video recording如何暂停/恢复视频录制
【发布时间】:2014-09-25 09:51:33
【问题描述】:

我想在录制视频时实现暂停/恢复功能。 MediaRecorder 没有任何暂停/恢复的方法。本机相机应用程序具有暂停/恢复功能。有没有可能实现?

请指导我。任何帮助或指导将不胜感激。

【问题讨论】:

    标签: android mediarecorder android-mediarecorder


    【解决方案1】:

    我终于找到了答案:) 我对 ffmpeg 的研究似乎更深入,并且在它周围挖掘了更多天但无法得到 ffmepg 的适当资源,我尝试使用 mp4parser lib 并成功完成了我的要求。

    合并多个视频的代码

    public class MergeVide extends AsyncTask<String, Integer, String> {
    
    @Override
    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(Video.this,
                "Preparing for upload", "Please wait...", true);
        // do initialization of required objects objects here
    };
    
    @Override
    protected String doInBackground(String... params) {
        try {
            String paths[] = new String[count];
            Movie[] inMovies = new Movie[count];
            for (int i = 0; i < count; i++) {
                paths[i] = path + filename + String.valueOf(i + 1) + ".mp4";
                inMovies[i] = MovieCreator.build(new FileInputStream(
                        paths[i]).getChannel());
            }
            List<Track> videoTracks = new LinkedList<Track>();
            List<Track> audioTracks = new LinkedList<Track>();
            for (Movie m : inMovies) {
                for (Track t : m.getTracks()) {
                    if (t.getHandler().equals("soun")) {
                        audioTracks.add(t);
                    }
                    if (t.getHandler().equals("vide")) {
                        videoTracks.add(t);
                    }
                }
            }
    
            Movie result = new Movie();
    
            if (audioTracks.size() > 0) {
                result.addTrack(new AppendTrack(audioTracks
                        .toArray(new Track[audioTracks.size()])));
            }
            if (videoTracks.size() > 0) {
                result.addTrack(new AppendTrack(videoTracks
                        .toArray(new Track[videoTracks.size()])));
            }
    
            BasicContainer out = (BasicContainer) new DefaultMp4Builder()
                    .build(result);
    
            @SuppressWarnings("resource")
            FileChannel fc = new RandomAccessFile(String.format(Environment
                    .getExternalStorageDirectory() + "/wishbyvideo.mp4"),
                    "rw").getChannel();
            out.writeContainer(fc);
            fc.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String mFileName = Environment.getExternalStorageDirectory()
                .getAbsolutePath();
        mFileName += "/wishbyvideo.mp4";
        filename = mFileName;
        return mFileName;
    }
    
    @Override
    protected void onPostExecute(String value) {
        super.onPostExecute(value);
        progressDialog.dismiss();
        Intent i = new Intent(Video.this, VideoUpload.class);
        i.putExtra("videopath", value);
        i.putExtra("id", id);
        i.putExtra("name", name);
        i.putExtra("photo", photo);
        startActivity(i);
        finish();
        }
    }
    

    计数只是视频文件计数。

    以上代码用于合并更多视频并将最终代码发送到另一个活动,因为我决定预览视频。 在使用上述代码之前,请确保使用 mp4parser 库。

    【讨论】:

    • 感谢您的回复。但是除了手动拼接视频文件还有其他方法吗?
    • 这不是一个好的解决方案,因为合并 2 个视频需要 2 多分钟,总共大约 5 分钟...
    • 有点晚了,但是这个解决方案会产生音频/视频同步问题。正如您在使用 mediaRecorder 创建视频时看到的那样,音频和视频流的长度并不完全相同。差异将在〜50到〜100毫秒之间(至少)。如果您尝试拼接 5 个视频,您会看到音频/视频不同步约 500 毫秒到 1000 毫秒,这是显而易见的。此外,如果您尝试分别录制视频和音频,那么您会发现 MediaRecorder 需要 250 毫秒到 800 毫秒才能启动,而 AudioRecord(假设您使用它)将在 100 毫秒以下启动。再次合并这些将产生同步问题。
    • 如果您的实施最多只需要几针(暂停),那么您可以使用此解决方案。
    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多