儘管重複,但我想用iPod庫中的AVAudioPlayer
播放歌曲。那麼是否可以在將iPod Library歌曲複製到應用程序後複製它?如何將iPod庫中的歌曲複製到應用程序並使用AVAudioPlayer播放?
我有一個代碼將歌曲轉換爲caf格式,然後我可以使用AVAudioPlayer
播放。但轉換時間太長。那麼還有其他方式可以做到嗎?
儘管重複,但我想用iPod庫中的AVAudioPlayer
播放歌曲。那麼是否可以在將iPod Library歌曲複製到應用程序後複製它?如何將iPod庫中的歌曲複製到應用程序並使用AVAudioPlayer播放?
我有一個代碼將歌曲轉換爲caf格式,然後我可以使用AVAudioPlayer
播放。但轉換時間太長。那麼還有其他方式可以做到嗎?
下面的代碼將從其url中讀取ipod庫歌曲並將其複製到磁盤以供使用。 請注意,此代碼不適用於m4as,因爲ipod庫中的m4as 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];
}
您可以使用MPMusicPlayerController,它是爲在應用程序中包含iPod接口而構建的。請參閱文檔:http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMusicPlayerController_ClassReference/Reference/Reference.html。
如果你真的需要使用MPMediaPickerController(這是我假設你正在使用選擇從用戶庫中的歌曲),看到這個帖子瞭如何播放歌曲: Using MPMediaItems with AVAudioPlayer
有關使用AVAssetExporter修復m4a文件頭部的任何提示? – bendytree
生成的mp3文件不顯示專輯封面,任何幫助 –
@James爲什麼會這樣?您正在複製音樂字節而不是專輯封面... – Daniel