Записывать звук с точными временными меткамиAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Записывать звук с точными временными метками

Сообщение Anonymous »

Я хочу записать необработанный звук на устройстве Android Wear и точно синхронизировать его с данными других датчиков, например акселерометра.
Для записи необработанного звука я использую AudioRecord, но как я могу определить правильную временную метку для любой части аудиопотока?
Основная проблема заключается в том, что я получаю необработанные аудиокадры из буфера без информации о том, как долго эти кадры находились в буфер, сколько кадров было потеряно и т. д.
Итак, чтобы получить данные кадра, я вызываю AudioRecord.read() в цикле, но как я могу определить, когда был записан конкретный кадр?
Я вижу три способа определения временной метки, и все они кажутся мне неправильными:
  • Получить текущий системное время до или после вызова AudioRecord.startRecording(), вызвав SystemClock.elapsedRealtimeNanos(), а затем вычислив время каждого фрагмента на основе частоты дискретизации и размера кадра. Но по моим тестам есть значительная задержка, прежде чем запись действительно начнется. Время также может рассинхронизироваться всякий раз, когда некоторые кадры теряются, например. когда обработка на мгновение останавливается.
  • Получите текущее системное время до или после AudioRecord.read(). Но, вероятно, это не то время, когда были зафиксированы эти данные, это могло произойти немного раньше. А если данных пока нет, read() заблокируется, и полученная ранее временная метка будет совершенно неверной.
  • Код: Выделить всё

    AudioRecord.getTimestamp()
    указывает время кадра, который в данный момент записывается. Но это не обязательно тот кадр, который я сейчас читаю, я мог отставать на пару кадров или пропустить некоторые кадры. И согласно первоначальным тестам, в течение некоторого времени после запуска временная метка просто равна нулю.
В результате у меня останется 6, вероятно, неправильных временных меток, как показано в коде ниже. Есть ли среди них хотя бы близкие к точности?

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»