Воспроизведение стерео тона в Android - PullRequest
6 голосов
/ 12 декабря 2011

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

У меня вопрос: как создать стерео тон, чтобы левый канал имел частоту, отличную от правого канала?

Я думал о предварительной записи WAV-файлов, но записывать много WAV-файлов и помещать их в папку res не очень хорошая идея.

Я сталкиваюсь с классами SoundPool и AudioTrack, но мне нужен фрагмент, показывающий различные частоты левого и правого каналов, сохраненные в виде буфера перед воспроизведением тона.

Или есть другие способы? Пожалуйста, предоставьте нужный фрагмент.

Ответы [ 4 ]

4 голосов
/ 15 декабря 2011

Я никогда не пробовал это:

  1. Инициализировать вашу левую и правую частоты
    //playback rate (1.0 = normal playback, range 0.5 to 2.0)
    float lFrequency = 1.0;
    float rFrequency = 1.0;

  2. Инициализация SoundPool объекта
    SoundPool sp = SoundPool(2, AudioManager.STREAM_MUSIC, 0);

  3. Загрузка дорожки дважды ( функция загрузки )
    int sLeft = sp.load(mContext, R.raw.yourAudioFileId, 1);
    int sRight = sp.load(mContext, R.raw.yourAudioFileId, 1);

  4. Воспроизведение 2 звуков (один слева и один справа) с использованием разных скоростей ( функция воспроизведения )
    sp.play (sLeft, 1.0, 0.0, 0, 0, lFrequency);
    sp.play (sRight, 0.0, 1.0, 0, 0, rFrequency);

3 голосов
/ 21 декабря 2011

Насколько я понимаю, если вы используете SoundPool, он будет играть в стерео без какой-либо специальной конфигурации.Из документации: «Библиотека SoundPool использует сервис MediaPlayer для декодирования аудио в необработанный 16-битный монофонический или стереопоток PCM», так что пока воспроизводимый вами файл находится в Stereo, он должен воспроизводиться именно таким образом.

1 голос
/ 22 декабря 2011

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

Сам звук представляет собой массив (обычно) 2-байтовых целых чисел.В стерео левый и правый сэмплы чередуются по всему массиву (таким образом, sample [0] - это первый L-образец, sample [1] - первый R-образец, sample [2] - второй L-образец и т. Д.).Поэтому, когда ваше приложение запускается, вы должны создать массив настолько долго, сколько вам нужно (с аудио качества CD, вашему массиву потребуется 88200 элементов на каждую секунду звука), затем заполните сэмплы вычисленными значениями для вашего тона, а затем передайте массивв AudioTrack для воспроизведения.

Или вы можете сохранить аудио в виде файла WAV и воспроизвести его с помощью SoundPool (что на самом деле может быть лучше с точки зрения объема памяти).Формат WAV очень прост в написании (чтение более сложное): просто 44-байтовый заголовок с различными свойствами, а затем сами аудиоданные.

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

Не я, но хороший код для чтения и записи WAV-файлов в Java:

http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java

0 голосов
/ 09 мая 2014

Я бы использовал другое программное обеспечение для создания стереофайла .ogg (не используйте WAV-файлы, они имеют слишком большой вес), это очень легкий аудиоформат, который хорошо работает в Android.Я использую бесплатный Reaper, Audacity проще, кто угодно.Просто создайте две монофонические звуковые дорожки, установите их панорамирование в положение вправо и влево.Загрузите сэмплы и примените плагин для изменения высоты тона, чтобы изменить частоту одного из треков.Вы также можете создать их с помощью синтезатора.Затем визуализируйте все в файл tone.ogg. Тон

...