Audio Toolbox, воспроизводящий mp3-файл (iOS) - PullRequest
2 голосов
/ 26 октября 2010

Я пытался воспроизвести mp3-файл с помощью Audio Toolbox и Audio Queues, но что бы я ни пытался, я ничего не проигрывал (ни в симуляторе, ни на устройстве).Когда я запускаю его в симуляторе, он говорит мне:

"Прайм не удался (-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;

    }

}

Ответы [ 2 ]

0 голосов
/ 20 июня 2013

Попробуйте:

Сначала импортируйте этот фреймворк в ваш файл 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];
0 голосов
/ 11 июля 2012

Ах да, это был 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); 

Вот достойное руководство для AVAudioPlayer .

...