Ios 将文件中的音频与生成的声音混合

Ios 将文件中的音频与生成的声音混合,ios,xamarin.ios,core-audio,Ios,Xamarin.ios,Core Audio,我使用的例子如下: 我修改了示例,为混频器添加了第三个输入,即简单的正弦波。我想让这两个音频文件与正弦波一起播放。为此,我为正弦波指定了一个单独的AudioStreamBasicDescription,并在混音器的HandleRenderDelegate中编码,以生成其样本 我面临的问题是,只有当我使用带有浮点采样的音频格式,而不是正弦波的有符号整数时,这才有效。如果我尝试使用整数,结果是音频文件中的声音严重失真,没有正弦波 下面是我用于float格式的代码(有效) 在HandleRenderD

我使用的例子如下:

我修改了示例,为混频器添加了第三个输入,即简单的正弦波。我想让这两个音频文件与正弦波一起播放。为此,我为正弦波指定了一个单独的
AudioStreamBasicDescription
,并在混音器的
HandleRenderDelegate
中编码,以生成其样本

我面临的问题是,只有当我使用带有浮点采样的音频格式,而不是正弦波的有符号整数时,这才有效。如果我尝试使用整数,结果是音频文件中的声音严重失真,没有正弦波

下面是我用于float格式的代码(有效)

HandleRenderDelegate中生成正弦波

    if (busNumber == 2) { // generate sine wave
        var outL = (float*)data[0].Data;
        var outR = (float*)data[1].Data;
        float s;


        for (int i = 0; i < numberFrames; i++) {
            s = (float)(Math.Sin((double)pitchSample / (44100 / 440) * 2 * Math.PI)) * .2f;
            pitchSample++;

            outL[i] = outR[i] = s;
        }

        return AudioUnitStatus.OK;
    }
以及波形发生器:

if (busNumber == 2) {
    var outL = (int*)data[0].Data;
    var outR = (int*)data[1].Data;
    short s;


    for (int i = 0; i < numberFrames; i++) {
        s = (short)(Math.Sin((double)pitchSample / (44100 / 440) * 2 * Math.PI) * .2 * Int16.MaxValue);
        pitchSample++;

        outL[i] = outR[i] = s;
    }

    return AudioUnitStatus.OK;
}
if(总线号==2){
var outL=(int*)数据[0]。数据;
var outR=(int*)数据[1]。数据;
短s;
for(int i=0;i
通过修改代码,我得到失真的声音文件,没有正弦波


为什么它只能处理浮点采样而不能处理整数?

我不确定这些是唯一的问题,但您的设置不一致:

  • 比特通道设置为32而不是16
  • 您可能希望转换为
    (short*)
    ,而不是
    (int*)
  • ChannelsPerFrame设置为1,但您在生成器中设置了立体声(我不确定这是否是错误)
(这里我假设您要使用16位有符号整数。)

注意:在浮点情况下,
BytesPerFrame
BytesPerPacked
应为4

                desc = new AudioStreamBasicDescription()
                {
                    BitsPerChannel = 32,
                    Format = AudioFormatType.LinearPCM,
                    FormatFlags = AudioFormatFlags.IsSignedInteger | AudioFormatFlags.IsPacked,
                    SampleRate = 44100,
                    ChannelsPerFrame = 1,
                    FramesPerPacket = 1,
                    BytesPerFrame = 2,
                    BytesPerPacket = 2
                };
if (busNumber == 2) {
    var outL = (int*)data[0].Data;
    var outR = (int*)data[1].Data;
    short s;


    for (int i = 0; i < numberFrames; i++) {
        s = (short)(Math.Sin((double)pitchSample / (44100 / 440) * 2 * Math.PI) * .2 * Int16.MaxValue);
        pitchSample++;

        outL[i] = outR[i] = s;
    }

    return AudioUnitStatus.OK;
}