簡體   English   中英

適用於16hz,16位單聲道格式的WAV文件的AudioStreamBasicDescription示例

[英]Example of AudioStreamBasicDescription for 16hz, 16bit mono format as WAV file

我在為上述格式創建描述時遇到了麻煩,並且嘗試了很多方法,但是在嘗試記錄時始終收到無效的參數。

有誰有如何創建這種格式的示例?

var audioFileOutputDescription : AudioStreamBasicDescription = AEAudioStreamBasicDescriptionNonInterleaved16BitStereo

    audioFileOutputDescription.mFormatID = kAudioFormatLinearPCM
    audioFileOutputDescription.mSampleRate = 16000.0
    audioFileOutputDescription.mBitsPerChannel = 16
    audioFileOutputDescription.mChannelsPerFrame = 1
    audioFileOutputDescription.mFramesPerPacket = 1
    audioFileOutputDescription.mFormatFlags = kAudioFormatFlagIsSignedInteger |
        kAudioFormatFlagsNativeEndian

謝謝。

您聲明AEAudioStreamBasicDescriptionNonInterleaved16BitStereo,用於2個通道,然后將mChannelsPerFrame = 1設置,用於1個通道。 頻道數量上的沖突可能是問題所在。

如果這不是問題,一種調試方法是從工作的asbd(來自Apple的示例應用程序或指南之一)開始,然后一次更改一件事以查找不受支持的參數或參數組合。

另外,WAV文件是小端的。

我沒有在任何地方設置mBytesPerPacket或mBytesPerFrame。

audioFileOutputDescription.mBytesPerFrame = 2;  // 1 mono channel * 2 bytes per channel

您可能需要添加一個轉換音頻單元,因為我發現音頻單元不支持ASBD內所有可能的變體。

輸入->轉換器AU->做您的魔術AU-> Convertback AU->輸出

我認為音頻單元的最大困難之一是ASBD,每個音頻單元類型僅支持多種格式,正如@ hotpaw2所建議的那樣,更改一個參數和測試有時是解決問題的唯一方法。 我還發現將音頻單元拆分成多個小型音頻單元以完成一項任務就可以很好地工作,因為它們重量輕且可以在將來重復使用。

對我來說效果很好:

fmt.mFormatID         = kAudioFormatLinearPCM; // 2
fmt.mSampleRate       = 8000.0;               // 3
fmt.mChannelsPerFrame = 1;                     // 4
fmt.mBitsPerChannel   = 16;                    // 5
fmt.mChannelsPerFrame = 1;
fmt.mFramesPerPacket  = 1;
fmt.mBytesPerFrame = 2;
fmt.mBytesPerPacket = 2;
// 7

fmt.mFormatFlags =                             // 9
kLinearPCMFormatFlagIsBigEndian
| kLinearPCMFormatFlagIsSignedInteger
| kLinearPCMFormatFlagIsPacked;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM