2014-11-05 2 views
3

Я пишу приложение для Android, где моя цель - записать пение пользователя. После записи я воспроизвожу запись, синхронизированную с инструментальной (что не является проблемой).Задержка записи звука

Проблема заключается в том, что я начинаю запись одновременно с воспроизведением звука, который, как я подозреваю, задержка начала записи: (это заметно, когда я пытаюсь воспроизвести запись позже, когда запись записывает инструментальную). Задержка может быть около 300 мс на связующей 5.

Мои запросы являются:

  • задержка постоянна на всех Android устройств (4.0 +)?
  • как рассчитать задержку без involving complex methods?
  • приемлемо на мобильном устройстве, чтобы открыть аудиозапись и масштабировать ее на инструментальную (которая может включать в себя декодирование/кодирование звука)?

Как избавиться от задержки?

+0

Я не думаю, что задержка постоянна, я думаю, что это зависит от скорости обработки. Возможно, вы могли бы просто добавить отметку в счетчик или что-то в этом роде. – Lukos

ответ

3

- постоянная задержки на всех устройствах Android (4.0 +)?

The delay является not constant, потому что, по крайней мере звук туда-обратно задержки is not constant.

Вы можете быть уверены, что задержка не является постоянной, поскольку это также зависит от:

как рассчитать задержку без сложных методов? You can't. (без сложных методов).

Задержка звука, о которой сообщает AudioTrack API, - это только латентность программного обеспечения.И measuring the latency is not a simple task, как вы можете видеть in the official documentation.

как избавиться от задержки?

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

Решение Джеффри - отличное начало. Обратите внимание, что вам нужно прочитать() данные, или ваши обратные вызовы не будут вызваны.

приемлемо на мобильном устройстве, чтобы открыть аудиозапись и масштабировать ее до инструментального (что может включать в себя декодирование/кодирование звука)?

AudioTrack.setVolume() дает вам простой способ масштабирования ваших дорожек. Поиск коэффициента масштабирования автоматически может быть довольно сложным: вам нужно будет оценить громкость записи, а также громкость вашего инструментального инструмента.

Я предлагаю вам использовать гораздо более простое решение: предоставить слайдер в пользовательском интерфейсе, который позволяет пользователю настраивать микширование между инструментом и записью голоса (используйте AudioTrack.setVolume в фоновом режиме). Таким образом, вы можете быть уверены, что соотношение сигнал/голос действительно соответствует вкусу пользователя.

+0

Благодарим вас за хорошо подтвержденный ответ. Я реализую решение Джеффри. Ваша информация действительно ценна! – jDourlens

4

Как уже упоминалось @Lukos, очень вероятно, что задержка зависит от скорости обработки. Для запуска рекордера требуется некоторое время.

Я считаю, что лучшим решением было бы сначала запустить рекордер, а затем начать воспроизведение звука, как только вы узнаете, что рекордер запущен. Таким образом, у вас будет небольшая задержка в записи, но, по крайней мере, вы находитесь в синхронизации. Вы должны убедиться, что воспроизведение было инициализировано, поэтому его можно запустить как можно быстрее.

Этого можно достичь с помощью обратных вызовов AudioRecorder.

// Assuming you have a recorder objects defined somewhere 
AudioRecord recorder; 

recorder.setNotificationMarkerPosition(1); 
recorder.setRecordPositionUpdateListener(new AudioRecord.OnRecordPositionUpdateListener() { 
    @Override 
    public void onMarkerReached(AudioRecord recorder) { 
     // start audio playback 
    } 

    @Override 
    public void onPeriodicNotification(AudioRecord recorder) { 

    } 
}); 

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

+0

Я попробую это, как только вернусь к работе. Я буду держать вас в курсе. Спасибо, что ответили! – jDourlens

+0

Извините, что не дал вам щедрости. Я использовал информацию, чтобы вы оба ответили, чтобы исправить мою проблему. И было плохо, что я не мог делиться щедростью пополам. – jDourlens