当前位置: 首页 > 知识库问答 >
问题:

Android音频流正弦音发生器异常行为

蒲勇
2023-03-14

第一次海报在这里。我通常喜欢自己找到答案(无论是通过研究还是反复试验),但我在这里被难住了。

我正在努力做:我正在建立一个简单的android音频合成器。现在,我只是在实时播放正弦音调,在用户界面中有一个滑块,可以随着用户的调整而改变音调的频率。

我是如何构建它的:基本上,我有两个线程--一个工作线程和一个输出线程。工作线程只是在每次调用其tick()方法时用正弦波数据填充缓冲区。一旦缓冲区被填满,它就警告输出线程数据已经准备好写入音轨。我使用两个线程的原因是因为AudioTrack.write()块,我希望工作线程能够尽快开始处理它的数据(而不是等待音轨完成写入)。UI上的滑块只需更改辅助线程中的一个变量,因此对频率的任何更改(通过滑块)都将被辅助线程的tick()方法读取。

我的音轨是这样设置的:

_buffSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
_audioTrackOut = new AudioTrack(AudioManager.STREAM_MUSIC, _sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, _buffSize, AudioTrack.MODE_STREAM);

工作线程的缓冲区是这样填充的(通过tick()):

public short[] tick()
{
    short[] outBuff = new short[_outBuffSize/2]; // (buffer size in Bytes) / 2
    for (int i = 0; i < _outBuffSize/2; i++) 
    {
        outBuff[i] = (short) (Short.MAX_VALUE * ((float) Math.sin(_currentAngle)));

        //Update angleIncrement, as the frequency may have changed by now
        _angleIncrement = (float) (2.0f * Math.PI) * _freq / _sampleRate;
        _currentAngle = _currentAngle + _angleIncrement;    
    }
    return outBuff;     
}

音频数据是这样写的:

_audioTrackOut.write(fromWorker, 0, fromWorker.length);

共有1个答案

公冶谦
2023-03-14

我已经找到了!

结果发现这个问题与缓冲区或线程无关。

在最初的几秒钟听起来很好,因为计算的角度相对较小。随着程序的运行和角度的增长,math.sin(_currentangle)开始产生不可靠的值。

 类似资料:
  • 问题内容: 第一次海报在这里。我通常喜欢自己找到答案(通过研究或反复试验得出),但是我很困惑。 我要做什么: 我正在构建一个简单的android音频合成器。现在,我只是在实时播放正弦音,UI中的滑块会随着用户的调整而改变音的频率。 如何构建它: 基本上,我有两个线程- 工作线程和输出线程。每当调用其tick()方法时,工作线程就用正弦波数据填充一个缓冲区。一旦缓冲区被填满,它会警告输出线程数据已准

  • 我想创建一个实时正弦发生器使用苹果核心音频框架。我想做低水平,这样我就可以学习和理解基本原理。 通过使用VSYNC,我可以将循环降低到60 fps。时间不是很紧,但相当稳定。我也有一些代码来手动使用马赫计时,这甚至更不精确。为了可读性我把它省略了。不使用VSYNC或使用马赫定时来获得每秒60次迭代也会造成音频故障。 定时日志: 这里重要的是函数。它每秒被调用60次,并传递给它一个包含基本信息的结构

  • 问题内容: 在Java中以任何频率生成正弦波声音的最简单方法是什么?样本大小大于2个字节会有所帮助,但这并不 重要。 问题答案: 见一个自包含的例子。 也许更简单? 如链接答案顶部所示,这51行代码段(在下面重复-分隔为单行和行内注释)大约与 生成音调一样简单(好的,您可以取出5行以上用于谐波)。 人们似乎认为这应该是工具包中内置的一种产生 纯净音调的方法。并非如此,要花一点时间就可以做到。

  • 用C/C++编写了一个三维正弦波发生器 代码:

  • 我在android上使用APPRTCdemo应用程序。我试着让它播放来自另一个同龄人的声音,音量与Android设置中设置的音量一样大。因此,如果用户将设备静音,则不会听到音频。我几乎尝试了每一个Android API调用,但似乎对音量没有任何影响。以下是我尝试过的东西:AudioManager AudioManager=(AudioManager)_context.getSystemServic

  • 我面临的问题,使用MediaPlayer以及原生Android音频播放器播放音频网址。这是我的网址http://live.politiafm.com:8500/politiafm.mp3 这是我的代码使用本机音频播放器Intent意图=new Intent(android.content.Intent。ACTION_VIEW);intent.setDataAndType(Uri.parse(STR