我们正在使用MediaRecorder在执行实际录制之前使用setOutputFile()将视频录制到外部存储上的文件中。
一切正常,但主要问题是录音一旦完成,我们就想开始在VideoView中播放录制的视频。
如何知道文件何时可以阅读和播放?
答案 0 :(得分: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()
。
答案 1 :(得分: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框。如果它到位,则文件完成。
答案 2 :(得分:1)
我自己没试过,但这可能有用:
public void release()从:API Level 1
释放与此MediaRecorder对象关联的资源。它是 完成使用后调用此方法的好习惯 MediaRecorder。
如果它按照它说的那样做,那么我想如果你调用它并且在这个方法返回之后你知道文件准备好了。
答案 3 :(得分:1)
在我的测试中,无论录制媒体的大小如何,Recorder.stop()都是一种阻止方法,只有在文件被媒体记录器完全写入和关闭后才会返回。
因此,JPM的答案实际上是正确的。
您可以在stop()之后立即调用File.length()来验证这一点。您会发现输出文件长度是此时文件的最终长度。换句话说,在返回stop()之后,媒体记录器不会向文件写入任何内容。
答案 4 :(得分: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();
}
}
然后您可以访问布尔值以查看它是否已停止录制。
答案 5 :(得分:0)
一种肮脏的方法是检查文件的lastModified()
值,如果文件未被修改2秒,则打开VideoView。
答案 6 :(得分:0)
我在xamarin中遇到了同样的问题并尝试了所有这些解决方案(Ash解决方案除外)。我最终解决这个问题的方法是在重置之前和调用Release之前调用releaseMediaRecorder()函数中的以下函数。
mediaRecorder.setOutputFile("some new file")