Для записи необработанного звука я использую AudioRecord, но как я могу определить правильную временную метку для любой части аудиопотока?
Основная проблема заключается в том, что я получаю необработанные аудиокадры из буфера без информации о том, как долго эти кадры находились в буфер, сколько кадров было потеряно и т. д.
Итак, чтобы получить данные кадра, я вызываю AudioRecord.read() в цикле, но как я могу определить, когда был записан конкретный кадр?
Я вижу три способа определения временной метки, и все они кажутся мне неправильными:
- Получить текущий системное время до или после вызова AudioRecord.startRecording(), вызвав SystemClock.elapsedRealtimeNanos(), а затем вычислив время каждого фрагмента на основе частоты дискретизации и размера кадра. Но по моим тестам есть значительная задержка, прежде чем запись действительно начнется. Время также может рассинхронизироваться всякий раз, когда некоторые кадры теряются, например. когда обработка на мгновение останавливается.
- Получите текущее системное время до или после AudioRecord.read(). Но, вероятно, это не то время, когда были зафиксированы эти данные, это могло произойти немного раньше. А если данных пока нет, read() заблокируется, и полученная ранее временная метка будет совершенно неверной.
- указывает время кадра, который в данный момент записывается. Но это не обязательно тот кадр, который я сейчас читаю, я мог отставать на пару кадров или пропустить некоторые кадры. И согласно первоначальным тестам, в течение некоторого времени после запуска временная метка просто равна нулю.
Код: Выделить всё
AudioRecord.getTimestamp()
Код: Выделить всё
recorder = new AudioRecord(...)
// timeBeforeStart = SystemClock.elapsedRealtimeNanos()
recorder.startRecording()
// timeAfterStart = SystemClock.elapsedRealtimeNanos()
...
// timeBeforeRead = SystemClock.elapsedRealtimeNanos()
// recorder.getTimestamp(frameTimeBeforeRead, AudioTimestamp.TIMEBASE_BOOTTIME)
recorder.read(myArray, 0, mySize);
// recorder.getTimestamp(frameTimeAfterRead, AudioTimestamp.TIMEBASE_BOOTTIME)
// timeAfterRead = SystemClock.elapsedRealtimeNanos()
Существует ли другой метод получения необработанных аудиоданных с точными метками времени?>
Подробнее здесь: https://stackoverflow.com/questions/634 ... timestamps
Мобильная версия