2017-07-01 149 views
0

正在使用我在这里找到了例子:https://developer.xamarin.com/samples/monotouch/MultichannelMixer/从文件中混合音频与产生的声音

我修改的例子第三输入添加到这是一个简单的正弦波混频器。我想让这两个音频文件与正弦波一起播放。我通过指定一个单独的AudioStreamBasicDescription作为混频器的正弦波和HandleRenderDelegate内的代码来生成它的样本。

我面临的问题是,这只适用于如果我使用浮点采样的音频格式,而不是正弦波的有符号整数。如果我尝试使用整数,结果是来自音频文件的声音严重失真,并且没有正弦波。

这里是代码,我使用了浮点格式(工作)

   desc = new AudioStreamBasicDescription() 
       { 
        BitsPerChannel = 32, 
        Format = AudioFormatType.LinearPCM, 
        FormatFlags = AudioFormatFlags.IsFloat | AudioFormatFlags.IsPacked, 
        SampleRate = 44100, 
        ChannelsPerFrame = 1, 
        FramesPerPacket = 1, 
        BytesPerFrame = 2, 
        BytesPerPacket = 2 
       }; 

生成的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; 
    } 

上面的代码工作正常正弦波,但现在我想为正弦波使用有符号整数格式。所以我修改的格式:

   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; 
} 

与修改后的代码,我得到扭曲声音效果的音频文件,并没有正弦波。

为什么它可以与浮动样本一起使用,但不是整数?

回答

1

我不知道这些是唯一的问题,但你有不一致的设置:

  • BitsPerChannel设置为32,而不是16
  • 你想转换为(short *)而不是(int *)
  • ChannelsPerFrame设置为1,但你在发电机组立体声(我不知道这是否是一个bug)

(我在这里假设你想使用16位有符号整数)

注意:在浮动情况下BytesPerFrameBytesPerPacked应该是4