2013-12-15 54 views
0

好吧,不能拿出一个好主题。通过此代码更改音频采样率当前更改位深度?

重点是,我有一个代码,我得到了帮助,将位深度从32位改为16位,不知道它是如何工作的,但我认为它只是删除了其他所有位,没有任何幻想。

所以如果可以用代码来做到这一点,应该可以改变采样率。 另外我不想在这里看到什么奇怪的东西,因为它更多的是用于调试,我只是想把它变成一些其他的采样率,它不一定是“重采样”。

例如,如果音频是48khz,并且在播放到47khz时重新采样它,它听起来不会像它仍然认为它是48khz一样,这意味着它会播放得更慢。

换句话说,我打算用它来以非常简单的方式改变音频的速度。

这是更改位深度的代码,我希望可以对此重用。

Int32 bytesrecorded = e.BytesRecorded; 
byte[] newArray16Bit = new byte[bytesrecorded/2]; 
fixed (byte* sourcePtr = e.Buffer) 
fixed (byte* targetPtr = newArray16Bit) 
{ 
    float* sourceTyped = (float*)sourcePtr; 
    short* targetTyped = (short*)targetPtr; 

    Int32 count = bytesrecorded/4; 
    for (int i = 0; i < count; i++) 
    { 
     targetTyped[i] = (Int16)(sourceTyped[i] * Int16.MaxValue); 
    } 
} 

e.Bytesrecorded =音频缓冲区的大小,

e.Buffer =实际缓冲

正如我不完全理解这一点,我只是看一下/ 2,并假设它只是分歧长度的大小,那么/ 4部分将移动字节,使其适合。

虽然我不知道如何使用它来改变采样率,因为这只是字节的移动,它不应该很难为采样率做些什么。

感谢

+0

更改位深和采样率是完全不同的过程。此代码不会帮助你。 –

+0

好的,很高兴知道这一点。 不存在类似的方法吗? 正如我只是想减少采样率,这将意味着,以某种方式删除一些字节。 – Zerowalker

+0

不,你不只是删除字节。我在这个问题的答案中详细讨论了两个:http://stackoverflow.com/questions/15087668/how-to-convert-pcm-samples-in-byte-array-as-floating-point-numbers-in范围 –

回答

0

如果要调整速度,有几个可能的解决方案:

  1. 使用重采样从例如重新取样的轨道44100Hz到 50000Hz,但仍然告诉音频驱动程序播放44100Hz。
  2. 只需更改文件的采样率,但不要更改 文件的内容。例如,修改波头并更改采样率。 音频播放器将读取wave-header的采样率,并且 将播放您的44100Hz音轨,采样率为例如。 60000Hz。
  3. 使用专业的dsp算法来调整速度。
+0

我不想用文件做它,它是一个流,需要做“实时”,这就是为什么要编码它,它是一个流。 – Zerowalker

+0

Libsamplerate可以实时使用。 –