2013-01-20 33 views
0

我有一些原始的聲音數據,我想製作成AIFF文件格式。我知道音頻數據的細節。我試圖從音頻中創建一個wave,但那不起作用。 OS X確實有一個創建頭文件的功能,但它直接寫入一個文件,我可能不想這麼做(該功能,SetupAIFFHeader已棄用且在64位代碼中不可用)。如何創建一個AIFF文件

+0

我能夠使QuickTime播放器7打開一個AIFF文件,沒有別的。代碼在我的SourceForge項目頁面上:[link](http://sourceforge.net/projects/playerpro)。 – MaddTheSane

+0

有一個免費的Mac,Windows和Linux庫,可以使用「fopen/fread/fwrite」風格來讀寫AIFF/AIFC文件(無壓縮),從而免除您必須編寫自己的低級別RIFF代碼的麻煩。 http://blogs.zynaptiq.com/bernsee/category/miniaiff/ –

回答

1

Apple的Core Audio API將創建數據並將其寫入AIFF文件和其他格式。它工作得很好,但在我看來,API很難使用。我將在下面粘貼一些示例代碼,但您可能想要更改它。 AudioFileWriteBytes一次可以寫入2個以上的字節。在AudioToolbox/ExtendedAudioFile.h中有另一個包裝API,它可以讓你編寫一個像32位浮點數的格式,並將其轉換爲底層格式,不管是AIFF/PCM還是壓縮格式。

double sampleRate = 44100; 
double duration = ...; 
long nSamples = (long)(sampleRate * duration); 

// Format struct for 1 channel, 16 bit PCM audio 
AudioStreamBasicDescription asbd; 
memset(&asbd, 0, sizeof(asbd)); 
asbd.mSampleRate = sampleRate; 
asbd.mFormatID = kAudioFormatLinearPCM; 
asbd.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger; 
asbd.mBitsPerChannel = 16; 
asbd.mChannelsPerFrame = 1; 
asbd.mFramesPerPacket = 1; 
asbd.mBytesPerFrame = 2; 
asbd.mBytesPerPacket = 2; 

CFURLRef url = makeUrl("hello.aiff"); 

AudioFileID audioFile; 
OSStatus res; 
res = AudioFileCreateWithURL(url, kAudioFileAIFFType, &asbd, 
          kAudioFileFlags_EraseFile, &audioFile); 
checkError(res); 

UInt32 numBytes = 2; 
for (int i=0; i<nSamples; i++) { 
    SInt16 sample = ... // something between SHRT_MIN and SHRT_MAX; 
    sample = OSSwapHostToBigInt16(sample);  
    res = AudioFileWriteBytes(audioFile, false, i*2, &numBytes, &sample); 
    checkError(res); 
} 

res = AudioFileClose(audioFile); 
checkError(res); 

checkError聲明res == noErr。 makeUrl看起來像:

CFURLRef makeUrl(const char *cstr) { 
    CFStringRef path = CFStringCreateWithCString(0, cstr, kCFStringEncodingUTF8); 
    CFURLRef url = CFURLCreateWithFileSystemPath(NULL, path, 0, false); 
    CFRelease(path); 
    return url; 
} 
0

儘管我討厭車輪改造,我懷疑你最好的選擇可能是推出自己的AIFF保存套路。

AIFF是在Amiga上使用的舊電子藝術EA-IFF格式的擴展;它是一系列4字節標識符(類似於FOURCC),塊長度和數據有效載荷。維基百科文章內容豐富,並提供其他網站的鏈接,其中包含有關格式的詳細信息。

http://en.wikipedia.org/wiki/Audio_Interchange_File_Format

0

我能寫正確的AIFF文件。讓我最後一點是我使用sizeof()作爲結構的大小,其中大小省略了前八個字節。我確實使用Apple的棄用AIFF.h頭文件來獲取結構,並且似乎QuickTime X和7都不讀取我在其中設置的元數據。

你可以在PlayerPRO的PlayerPRO 6分支上看到我的作品。它位於PPApp_AppDelegate.m函數中的一個文件-createAIFFDataFromSettings:data: