2013-12-15 98 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可以實時使用。 –