我試圖獲得用音頻工具箱和音頻隊列播放的mp3文件,但無論我嘗試什麼,我都沒有播放任何內容(無論是在模擬器還是在設備上)。當我在模擬器中運行它,它告訴我:播放mp3文件的音頻工具箱(iOS)
「總理失敗(-66674);將停止(0/0張)」,
所以我覺得這是一個基本的錯誤的地方,也許在AudioEnqueueBuffer函數,因爲之後隊列中似乎沒有任何東西。當我詢問身份時,我總是回到0。
對不起,我發佈了這麼多的代碼,但我不知道錯誤在哪裏。
請幫幫我。
- (void)startPlayback{
NSString *fileString = [[NSBundle mainBundle] pathForResource:@"musik" ofType:@"mp3"];
const char *filePathAsCString = [fileString UTF8String];
CFURLRef fileURL = CFURLCreateFromFileSystemRepresentation(NULL, (UInt8*)filePathAsCString, strlen(filePathAsCString), false);
playState.currentPacket = 0;
playState.dataFormat->mSampleRate = kAudioStreamAnyRate;
playState.dataFormat->mFormatID = kAudioFormatMPEGLayer3;
playState.dataFormat->mFramesPerPacket = 0;
playState.dataFormat->mChannelsPerFrame = 2;
playState.dataFormat->mBytesPerFrame = 0;
playState.dataFormat->mBytesPerPacket = 0;
playState.dataFormat->mBitsPerChannel = 0;
playState.dataFormat->mReserved = 0;
playState.dataFormat->mFormatFlags = 0;;
OSStatus status;
status = AudioFileOpenURL(fileURL, kAudioFileReadPermission, kAudioFileMP3Type, &playState.audioFile);
if(status == 0)
{
status = AudioQueueNewOutput(
&playState.dataFormat,
MyAudioOutputCallback,
&playState,
CFRunLoopGetCurrent(),
0,
0,
&playState.queue);
if(status == 0)
{
playState.playing = true;
for(int i = 0; i < 3 && playState.playing; i++)
{
if(playState.playing)
{
AudioQueueAllocateBufferWithPacketDescriptions(playState.queue, 64000, sizeof(AudioStreamPacketDescription)*75, &playState.buffers[i]);
MyAudioOutputCallback(&playState, playState.queue, playState.buffers[i]);
}
}
if(playState.playing)
{
status = AudioQueueStart(playState.queue, NULL);
if(status == 0)
{
NSLog(@"Playing");
}
}
}
}
if(status != 0)
{
NSLog(@"Play failed");
}
}
而且這裏的回調函數:
void MyAudioOutputCallback(void *inUserData,
AudioQueueRef outAQ,
AudioQueueBufferRef outBuffer)
{
PlayState *playState= (PlayState *)inUserData;
UInt32 bytesRead;
UInt32 numPackets = 75;
OSStatus status;
status = AudioFileReadPackets(playState->audioFile, false, &bytesRead, outBuffer->mPacketDescriptions, playState->currentPacket, &numPackets, outBuffer->mAudioData);
if(numPackets)
{
outBuffer->mAudioDataByteSize = bytesRead;
outBuffer->mPacketDescriptionCount = numPackets;
status = AudioQueueEnqueueBuffer(
playState->queue,
outBuffer,
0,
0);
NSLog(@"EnqueueStatus: %d", status);
playState->currentPacket += numPackets;
}
}