【发布时间】:2011-11-17 02:54:42
【问题描述】:
我们使用 MediaRecorder 在进行实际录制之前使用 setOutputFile() 将视频录制到外部存储上的文件中。
一切正常,但主要问题是,一旦录制完成,我们想开始在 VideoView 中播放录制的视频。
如何知道文件何时可以读取和播放?
【问题讨论】:
标签: android file video mediarecorder
我们使用 MediaRecorder 在进行实际录制之前使用 setOutputFile() 将视频录制到外部存储上的文件中。
一切正常,但主要问题是,一旦录制完成,我们想开始在 VideoView 中播放录制的视频。
如何知道文件何时可以读取和播放?
【问题讨论】:
标签: android file video mediarecorder
FileObserver 类非常适合您的需求。 Here is the documentation。它很容易使用。当观察到的文件写入后关闭时,以CLOSE_WRITE为参数调用onEvent回调。
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()。
【讨论】:
onEvent 中检查它。如果录制暂停,则忽略该事件。
FileObserver 时的一个问题是它不像宣传的那样工作。它不是监视单个文件,而是监视一个目录。因此,请监视目录的更改。在onEvent(int event, String path) 中,受影响的实际文件的路径将作为String 参数传递。然后,您可以将该路径与您感兴趣的文件的路径进行比较并做出相应的响应。请参阅stackoverflow.com/questions/16448002/… 了解更多信息。
我们用以下算法解决了类似的问题:
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 框。如果它到位,那么文件是完整的。
【讨论】:
在我的测试中,无论录制文件的大小如何,mediaRecorder.stop() 都是一个阻塞方法,仅在文件被媒体录制器完全写入和关闭后才返回。
所以 JPM 的回答实际上是正确的。
您可以通过在 stop() 之后立即调用 File.length() 来验证这一点。你会发现输出文件长度就是此时文件的最终长度。换句话说,媒体记录器不会在 stop() 返回后向文件写入任何内容。
【讨论】:
我自己没有尝试过,但这可能有效:
public void release () 自:API 级别 1
释放与此 MediaRecorder 对象关联的资源。它是 使用完后调用此方法的好习惯 媒体记录器。
如果它按照它说的做,那么我猜如果你调用它并且在这个方法返回之后你知道文件已经准备好了。
【讨论】:
显然没有办法检测媒体播放器中的录制何时停止,但是如果您创建一个实现 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();
}
}
然后您可以访问布尔值以查看它是否已停止录制。
【讨论】:
一种肮脏的方法是检查文件的lastModified() 值,如果文件在 2 秒内没有被修改,则打开 VideoView。
【讨论】: