如何知道MediaRecorder何时完成将数据写入文件

问题描述 投票:17回答:7

在进行实际录制之前,我们使用MediaRecorder使用setOutputFile()将视频录制到外部存储上的文件中。

一切正常,但主要问题是,一旦录制完成,我们就想开始在VideoView中播放录制的视频。

如何知道文件何时可以读取和播放?

android file video mediarecorder
7个回答
19
投票

FileObserver类完美地满足您的需求。 Here is the documentation。它易于使用。在写入后关闭观察文件时,将使用onEvent作为参数调用CLOSE_WRITE回调。

MyFileObserver fb = new MyFileObserver(mediaFile_path, FileObserver.CLOSE_WRITE);
fb.startWatching();

class MyFileObserver extends FileObserver {

    public MyFileObserver (String path, int mask) {
        super(path, mask);
    }

    public void onEvent(int event, String path) {
        // start playing
    }
}

别忘了打电话给stopWatching()


5
投票

我们用以下算法解决了类似的问题:

while (file not complete)
    sleep for 1 sec
    read the fourth byte of the file
    if it is not 0 (contains 'f' of the 'ftyp' header) then
        file is complete, break

关键点在于MediaRecorder在最后一刻编写了ftyp框。如果它到位,则文件完成。


1
投票

我自己没试过,但这可能有用:

public void release()自:API Level 1

释放与此MediaRecorder对象关联的资源。在使用MediaRecorder时调用此方法是一种很好的做法。

如果它按照它说的那样做,那么我想如果你调用它并且在这个方法返回之后你知道文件已经准备好了。


1
投票

在我的测试中,无论录制媒体的大小如何,Recorder.stop()都是一种阻止方法,只有在文件被媒体记录器完全写入和关闭后才会返回。

所以JPM的答案实际上是正确的。

您可以通过在stop()之后立即调用File.length()来验证这一点。您会发现输出文件长度是此时文件的最终长度。换句话说,在返回stop()之后,媒体记录器不会向文件写入任何内容。


0
投票

显然,无法检测录制在媒体播放器中何时停止,但是如果您创建了一个实现MediaRecorder的自定义类,则可以覆盖stop()。在这里我会做这样的事情:

public class MyRecorder implements MediaRecorder {
    public boolean stopped;

    .... implement all the methods that MediaRecorder has making 
         sure to call super for each method.

    @Override
    public void myStop() {
        this.stopped = true;
        super.stop(); 
    }
}

然后,您可以访问布尔值以查看它是否已停止录制。


0
投票

一种肮脏的方法是检查文件的lastModified()值,如果文件未被修改2秒,则打开VideoView。


0
投票

我在xamarin中遇到了同样的问题并尝试了所有这些解决方案(Ash解决方案除外)。我最终解决这个问题的方法是在重置之前和调用Release之前调用releaseMediaRecorder()函数中的以下函数。

mediaRecorder.setOutputFile("some new file")
© www.soinside.com 2019 - 2024. All rights reserved.