这是来自Learning Core Audio http://www.amazon.com/Learning-Core-Audio-Hands-On-Programming/dp/0321636848的代码 就像书中所说,生成立体声应该将asbd.mBitsPerChannel设置为8,将asbd.mChannelsPerFrame设置为2。但我得到的音频只有一个频道。我不知道代码有什么问题,请帮帮我。感谢
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
#define SAMPLE_RATE 44100
#define DURATION 5.0
#define FILENAME_FORMAT @"%0.3f-square.aif"
int main(int argc, const char * argv[])
{
@autoreleasepool {
if (argc < 2) {
printf("Usage: CAToneFileGenerator n\n(where n is tone in Hz)");
return -1;
}
double hz = atof(argv[1]);
assert(hz > 0);
NSLog(@"generating %f hz tone", hz);
NSString *fileName = [NSString stringWithFormat:FILENAME_FORMAT, hz];
NSString *filePath = [[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:fileName];
NSLog(@"%@", filePath);
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
AudioStreamBasicDescription asbd;
memset(&asbd, 0, sizeof(asbd));
asbd.mSampleRate = SAMPLE_RATE;
asbd.mFormatID = kAudioFormatLinearPCM;
asbd.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
asbd.mBitsPerChannel = 8;
asbd.mChannelsPerFrame = 2;
asbd.mFramesPerPacket = 1;
asbd.mBytesPerFrame = 2;
asbd.mBytesPerPacket = 2;
AudioFileID audioFile;
OSStatus audioErr = noErr;
audioErr = AudioFileCreateWithURL((CFURLRef) fileURL, kAudioFileAIFFType, &asbd, kAudioFileFlags_EraseFile, &audioFile);
assert(audioErr == noErr);
long maxSampleCount = SAMPLE_RATE * DURATION;
long sampleCount = 0;
UInt32 bytesToWrite = 2;
double wavelengthInSamples = SAMPLE_RATE / hz;
while (sampleCount < maxSampleCount) {
for (int i = 0; i < wavelengthInSamples; i++) {
SInt16 sample;
if (i < wavelengthInSamples /2) {
sample = CFSwapInt16HostToBig(SHRT_MAX);
}else{
sample = CFSwapInt16HostToBig(SHRT_MIN);
}
audioErr = AudioFileWriteBytes(audioFile, false, sampleCount*2, &bytesToWrite, &sample);
assert(audioErr == noErr);
sampleCount ++;
}
}
audioErr = AudioFileClose(audioFile);
assert(audioErr == noErr);
NSLog(@"wrote %ld samples", sampleCount);
}
return 0;
}
答案 0 :(得分:2)
只是从书籍代码更改ASBD并不会神奇地修复所有内容。您还没有考虑如何将样本写入文件。此外,8位听起来像屁股。
回到mBitsPerChannel = 16,然后说明你每帧写两个频道的事实,这意味着mBytesPerFrame和mBytesPerPacket现在将是4(书中它们是2)。想想为什么会这样。
然后你应该只能添加对AudioFileWriteBytes()的第二次调用 - 或者在你计算mChannelsPerFrame的循环之后 - 在第一次调用之后。但是你必须考虑文件中的不同偏移,因为你每次写入4个字节而不是2个。我认为这是正确的:
audioErr = AudioFileWriteBytes(audioFile, false, sampleCount*4, &bytesToWrite, &sample); // left
audioErr = AudioFileWriteBytes(audioFile, false, (sampleCount*4)+2, &bytesToWrite, &sample); // right
你需要自己弄清楚这些东西才能让它沉入其中。