如何将歌曲从 iPod 库复制到应用程序并使用 AVAudioPlayer 播放?

Posted

技术标签:

【中文标题】如何将歌曲从 iPod 库复制到应用程序并使用 AVAudioPlayer 播放?【英文标题】:How to copy songs from iPod Library to app and play with AVAudioPlayer? 【发布时间】:2011-09-19 13:59:46 【问题描述】:

虽然重复,但我想使用 iPod 库中的 AVAudioPlayer 播放歌曲。那么 iPod Library 歌曲复制到应用后是否可以复制?

我有一个代码可以将歌曲转换为 caf 格式,然后我可以使用AVAudioPlayer 播放。但是转换需要很长时间。那么有没有其他方法可以做到这一点?

【问题讨论】:

【参考方案1】:

下面的代码将从它的 url 中读取 ipod 库歌曲并将其复制到磁盘以供使用.. 请注意,此代码不适用于 m4as,因为 m4as 的 ipod 库中的 URL 不包含标题,因此您需要使用 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];



    

【讨论】:

关于使用 AVAssetExporter 修复 m4a 文件头的任何提示? 生成的 mp3 文件不显示专辑封面,任何帮助 @Daniel 你有什么想法吗,如何将专辑封面添加到生成的 mp3 文件中 @James,请试试这个代码,我已经在这里发布到我的博客iphone.sanniv.com/2015/03/22/add-album-art-to-mp3-files-in-ios【参考方案2】:

您可以只使用 MPMusicPlayerController,它是为在应用程序中包含 iPod 界面而构建的。请参阅文档:http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMusicPlayerController_ClassReference/Reference/Reference.html

如果您确实需要使用 MPMediaPickerController(我假设您正在使用它从用户库中选择歌曲),请参阅这篇文章了解如何播放歌曲: Using MPMediaItems with AVAudioPlayer

【讨论】:

以上是关于如何将歌曲从 iPod 库复制到应用程序并使用 AVAudioPlayer 播放?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 AVAudioPlayer 播放 iPod 歌曲?

iOS 如何从歌曲(ipod 库)中获取音频样本?

如何以编程方式将音频文件从 iPhone 的文件系统复制到资产库

在 iOS 中从 iPod 库歌曲创建独立的音频剪辑

我如何允许用户从他们的 iPod 库中挑选歌曲?

从 ipod 库导入媒体