2012-01-08 7 views
5

Во-первых, мне нужно генерировать 2 синусоидальных сигнала на лету, которые имеют одинаковую частоту, но противоположны фазам и воспроизводят их отдельно в правый и левый каналы в стерео режиме на Android. Воспроизведение должно быть полностью синхронизировано, так что синусы левого и правого каналов «зеркалируются» (когда левый канал имеет, скажем, значение образца 120, правый канал должен иметь -120).Как играть в левый и правый каналы отдельно с помощью AudioTrack?

Дело в том, что я не нашел никаких доказательств того, как эта настройка будет работать. Есть ли возможность подавать 2 отдельных тона/буфера для воспроизведения до AudioTrack для воспроизведения в левом и правом каналах отдельно и одновременно? Если нет, любые другие решения для достижения конечного результата заслуживают высокой оценки.

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

+2

Благодаря niko20 в группе разработчиков Android: «Вам не нужен отдельный буфер для правого и левого. Стерео аудио - это чередующиеся. Для вывода стереофайла вы просто заполняете буфер слева-направо - влево-вправо».Это действительно хорошо работает, протестировано с помощью AudioTrack – rar

ответ

0

Хорошо, это может сработать, поскольку есть только два образца.

Сначала проверьте SoundPool. Это полезно, когда у вас есть дорожки, которые требуют хорошей производительности, поскольку они полностью загружаются в память. Однако это имеет свои недостатки, главным из которых является ограничение размера треков, хранящихся в памяти. Когда я впервые использовал это, я попытался поместить 2 x 4Mb-файла в поток - это была не очень хорошая идея.

Soundpool имеет эту функцию:

setVolume(int streamID, float leftVolume, float rightVolume) 

Обратите внимание, как вы можете установить громкость слева и справа для каждого потока? Для потока 1 вы можете получить максимальный левый том, а затем для потока 2 увеличенный правый том.

Я бы установил потоки с файлами для воспроизведения и объемом по желанию, а затем воспроизвел их.

Простое руководство можно найти на сайте http://www.vogella.de/articles/AndroidMedia/article.html

+0

OK Я понимаю, что вы имеете в виду, но, к сожалению, SoundPool мне не очень помогает, поскольку мне нужно генерировать звуки в моем коде и использовать AudioTrack и MODE_STREAM для того, чтобы подавать игровой буфер на лету , AudioTrack поддерживает конфигурации CHANNEL_OUT_MONO и CHANNEL_OUT_STEREO, но я не нашел возможности фактически передавать разные генерируемые кодом звуки на левый и правый каналы. – rar

5

AudioTrack имеет тот же метод, как Soundpool. Это называют

AudioTrack.setStereoVolume();

Если вы хотите играть в левый/правый канал одновременно с разными данными. Вы должны обрабатывать данные для достижения этой цели. Если вы выбираете стереорежим с 16-битным PCM, данные для одного и того же байта для одного байта для одного байта. Например:

левый канал хочет играть: 12, 23, 34, 45

правого канала хочет играть: 54, 43, 32, 21 в то же время с левым каналом.

данные должны быть получены следующим образом: {12, 54, 23, 43, 34, 32, 45, 21}

Затем, используя AudioTrack.write (данные). Он отлично встретит вас.

+0

Правильно ли это? Должен ли я поместить один элемент каждого канала в другое место вдоль выходного буфера? –

+0

Я пытаюсь сделать одиночный канал для моно аудио, но я нашел, что теперь это делается с помощью public int setVolume (float gain) Добавлен в уровень API 21 Устанавливает заданное значение выходного коэффициента усиления на всех каналах этого трека. Этот API предпочтительнее, чем setStereoVolume (float, float), поскольку он более грациозно масштабируется до моно и до многоканального контента за пределами стерео. Итак, как бы мне сейчас это контролировать? – VMMF

 Смежные вопросы

  • Нет связанных вопросов^_^