2010-10-25 88 views
2

我試圖獲得用音頻工具箱和音頻隊列播放的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; 

    } 

} 

回答

0

噢,那是2010年,可怕的日子,你必須給自己緩衝的樣品只是起到一個再用音頻文件......如今,如果所有你想要做的就是播放音頻文件,AVAudioPlayer是你的朋友。

NSError *error = nil; 
AVAudioPlayer *myMP3File = [[AVAudioPlayer alloc] initWithContentsOfURL: 
          [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/MyFile.mp3", 
          [[NSBundle mainBundle] resourcePath]]] error:&error]; 
[myMP3File play]; 
if(error != nil) NSLog(@"Error mp3 file: %@",error); 

這是一個體面的tutorial for AVAudioPlayer

0

試試這個:

首先導入該框架文件AVFoundation/AVFoundation.h

然後聲明AVAudioPlayer的一個實例。 AVAudioPlayer * audioPlayer;

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Name of your audio file" 
                 ofType:@"type of your audio file example: mp3"]; 

NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; 

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil]; 

audioPlayer.numberOfLoops = -1; 

[audioPlayer play];