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

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

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

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

Ответ 1

Класс 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()..

Ответ 2

Мы решили аналогичную задачу со следующим алгоритмом:

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

Ответ 3

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

public void release() С: API Level 1

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

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

Ответ 4

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

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

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

Ответ 5

По-видимому, нет способа обнаружить, когда запись остановилась в Media Player, но есть остановка(), которую вы можете переопределить, если вы создадите пользовательский класс, который реализует 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(); 
    }
}

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

Ответ 6

Грязным способом было бы проверить значение lastModified() файла и открыть VideoView, если файл не был изменен в течение 2 секунд.

Ответ 7

У меня была такая же проблема в xamarin и пробовал все эти решения (кроме решения Ash). Что я, наконец, сделал для решения этой проблемы, так это вызов функции ниже в функции releaseMediaRecorder() до Reset и до того, как вызывается Release.

mediaRecorder.setOutputFile("some new file")