Как узнать, когда MediaRecorder закончил запись данных в файл

мы используем MediaRecorder для записи видео в файл на внешнем хранилище с помощью setOutputFile () перед выполнением фактической записи.

все работает нормально, но главная проблема в том, что как только запись будет сделана, мы хотим начать воспроизведение записанного видео в видеообзоре.

Как узнать, когда файл готов для чтения и воспроизведения?

7 ответов


на FileObserver класс идеально подходит для ваших нужд. вот документация. Его легко использовать. Когда наблюдаемый файл закрывается после записи,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()..


мы решили аналогичную проблему со следующим algo:

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 в самый последний момент. Если он на месте, то файл завершен.


Я не пробовал это сам, но это может сработать:

public void release () Since: API Level 1

освобождает ресурсы, связанные с этим объектом MediaRecorder. Это хорошая практика для вызова этого метода, когда вы закончите использовать MediaRecorder.

Если он делает то, что говорит, то я думаю, если вы вызываете это, и после возвращения этого метода вы знаете, что файл готов.


в моих тестах, независимо от размера mediaRecorder для записи.stop () - это метод блокировки, который возвращается только после того, как файл был полностью записан и закрыт Media recorder.

таким образом, ответ JPMs на самом деле правильный.

вы можете проверить это, вызвав файл.длина() сразу после остановки(). Вы обнаружите, что длина выходного файла является конечной длиной файла на данный момент. Другими словами, media recorder больше ничего не пишет файл после stop() вернулся.


по-видимому, нет способа определить, когда запись остановилась в Media player, но есть stop (), который вы можете переопределить, если создадите пользовательский класс, реализующий MediaRecorder. здесь я бы сделал что-то вроде этого:

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() значение файла и откройте VideoView, если файл не был изменен в течение 2 секунд.


У меня была такая же проблема в xamarin и я пробовал все эти решения (кроме решения Ash). То, что я, наконец, сделал, чтобы решить эту проблему, - это вызвать функцию ниже в функции releaseMediaRecorder() перед сбросом и перед вызовом выпуска.

mediaRecorder.setOutputFile("some new file")