Как скопировать песни из iPod Library в приложение и играть с AVAudioPlayer? - PullRequest
3 голосов
/ 19 сентября 2011

Хоть и дубликат, но я хочу воспроизвести песню, используя AVAudioPlayer из iPod Library.Так можно ли копировать песни из iPod Library после копирования в приложение?

У меня есть один код, который преобразует песню в формат caf, и затем я могу играть, используя AVAudioPlayer.Но преобразование занимает слишком много времени.Так есть ли другой способ, которым я могу это сделать?

Ответы [ 2 ]

6 голосов
/ 19 сентября 2011

Следующий код будет считывать песню библиотеки ipod из ее URL-адреса и копировать ее на диск для использования. Обратите внимание, что этот код не будет работать с m4as, поскольку URL-адреса из библиотеки ipod для m4as не содержат заголовков, для этого вам потребуется использоватьAVAssetExporter для записи заголовка и музыкальных данных на диск.

 -(void)exportMP3:(NSURL*)url toFileUrl:(NSString*)fileURL
    {
        AVURLAsset *asset=[[[AVURLAsset alloc] initWithURL:url options:nil] autorelease];
        AVAssetReader *reader=[[[AVAssetReader alloc] initWithAsset:asset error:nil] autorelease];
        NSMutableArray *myOutputs =[[[NSMutableArray alloc] init] autorelease];
        for(id track in [asset tracks])
        {
            AVAssetReaderTrackOutput *output=[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track outputSettings:nil];
            [myOutputs addObject:output];   
            [reader addOutput:output];
        }
        [reader startReading];
        NSFileHandle *fileHandle ;
        NSFileManager *fm=[NSFileManager defaultManager];
        if(![fm fileExistsAtPath:fileURL])
        {
            [fm createFileAtPath:fileURL contents:[[[NSData alloc] init] autorelease] attributes:nil];
        }
        fileHandle=[NSFileHandle fileHandleForUpdatingAtPath:fileURL];    
        [fileHandle seekToEndOfFile];

        AVAssetReaderOutput *output=[myOutputs objectAtIndex:0];
         int totalBuff=0;
        while(TRUE)
        {
             CMSampleBufferRef ref=[output copyNextSampleBuffer];
            if(ref==NULL)
                break;
            //copy data to file
            //read next one
            AudioBufferList audioBufferList;
            NSMutableData *data=[[NSMutableData alloc] init];
            CMBlockBufferRef blockBuffer;
            CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(ref, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);

            for( int y=0; y<audioBufferList.mNumberBuffers; y++ )
            {
                AudioBuffer audioBuffer = audioBufferList.mBuffers[y];
                Float32 *frame = audioBuffer.mData;


                //  Float32 currentSample = frame[i];
                [data appendBytes:frame length:audioBuffer.mDataByteSize];

              //  written= fwrite(frame, sizeof(Float32), audioBuffer.mDataByteSize, f);
                ////NSLog(@"Wrote %d", written);

            }
            totalBuff++;
            CFRelease(blockBuffer);
            CFRelease(ref);
            [fileHandle writeData:data];
          //  //NSLog(@"writting %d frame for amounts of buffers %d ", data.length, audioBufferList.mNumberBuffers);
            [data release];
        }
      //  //NSLog(@"total buffs %d", totalBuff);
    //    fclose(f);
        [fileHandle closeFile];



    }
0 голосов
/ 19 сентября 2011

Вы можете просто использовать MPMusicPlayerController, который предназначен для включения интерфейса iPod в приложение.См. Документы: http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMusicPlayerController_ClassReference/Reference/Reference.html.

Если вам действительно нужно использовать MPMediaPickerController (я предполагаю, что вы используете его для выбора песен из библиотеки пользователей), см. Этот пост о том, как воспроизводить песни: Использование MPMediaItems с AVAudioPlayer

...