Как узнать, когда MediaRecorder завершил запись данных в файл - PullRequest
17 голосов
/ 14 сентября 2011

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

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

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

Ответы [ 7 ]

19 голосов
/ 23 сентября 2011

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

5 голосов
/ 20 сентября 2011

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

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 голос
/ 10 марта 2014

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

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

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

1 голос
/ 20 сентября 2011

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

public void release () С тех пор: Уровень API 1

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

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

0 голосов
/ 23 января 2015

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

mediaRecorder.setOutputFile("some new file")
0 голосов
/ 18 сентября 2011

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

0 голосов
/ 14 сентября 2011

Очевидно, что нет способа определить, когда запись остановилась в 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(); 
    }
}

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

...