2012-10-30 18 views
2

我已经从我的iPhone设备中检索到所有音乐和视频。我现在坚持将它们保存到我的应用程序中,我无法从文件中获取原始数据。任何人都可以帮助我找到解决方案。这是我用来获取音乐文件的代码。从iPhone中的音乐文件中获取NSData

MPMediaQuery *deviceiPod = [[MPMediaQuery alloc] init]; 
NSArray *itemsFromGenericQuery = [deviceiPod items]; 
for (MPMediaItem *media in itemsFromGenericQuery){ 
//i get the media item here. 
} 

如何将其转换为NSData? 这就是我试图让数据

audioURL = [media valueForProperty:MPMediaItemPropertyAssetURL];//here i get the asset url 
NSData *soundData = [NSData dataWithContentsOfURL:audioURL]; 

使用,这是没用的我。我不知道从LocalAssestURL得到的数据。任何解决方案。在此先感谢

回答

9

这不是一项简单的任务 - Apple的SDK通常无法为简单任务提供简单的API。这是我在我的一个调整中使用的代码,以便从资产中获取原始PCM数据。你需要的AVFoundation和CoreMedia框架添加到项目中,为了得到这个工作:

#import <AVFoundation/AVFoundation.h> 
#import <CoreMedia/CoreMedia.h> 

MPMediaItem *item = // obtain the media item 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

// Get raw PCM data from the track 
NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL]; 
NSMutableData *data = [[NSMutableData alloc] init]; 

const uint32_t sampleRate = 16000; // 16k sample/sec 
const uint16_t bitDepth = 16; // 16 bit/sample/channel 
const uint16_t channels = 2; // 2 channel/sample (stereo) 

NSDictionary *opts = [NSDictionary dictionary]; 
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:assetURL options:opts]; 
AVAssetReader *reader = [[AVAssetReader alloc] initWithAsset:asset error:NULL]; 
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, 
    [NSNumber numberWithFloat:(float)sampleRate], AVSampleRateKey, 
    [NSNumber numberWithInt:bitDepth], AVLinearPCMBitDepthKey, 
    [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved, 
    [NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey, 
    [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey, nil]; 

AVAssetReaderTrackOutput *output = [[AVAssetReaderTrackOutput alloc] initWithTrack:[[asset tracks] objectAtIndex:0] outputSettings:settings]; 
[asset release]; 
[reader addOutput:output]; 
[reader startReading]; 

// read the samples from the asset and append them subsequently 
while ([reader status] != AVAssetReaderStatusCompleted) { 
    CMSampleBufferRef buffer = [output copyNextSampleBuffer]; 
    if (buffer == NULL) continue; 

    CMBlockBufferRef blockBuffer = CMSampleBufferGetDataBuffer(buffer); 
    size_t size = CMBlockBufferGetDataLength(blockBuffer); 
    uint8_t *outBytes = malloc(size); 
    CMBlockBufferCopyDataBytes(blockBuffer, 0, size, outBytes); 
    CMSampleBufferInvalidate(buffer); 
    CFRelease(buffer); 
    [data appendBytes:outBytes length:size]; 
    free(outBytes); 
} 

[output release]; 
[reader release]; 
[pool release]; 

这里data将包含曲目的原始PCM数据;你可以使用某种编码来压缩它,例如我使用FLAC编解码器库。

查看original source code here

+2

awesomely done111 – Kamarshad

+0

此代码需要超过2秒的iPhone 4上的单个音频文件。有什么办法让这个文件读取更快? –

+1

@iDev No. [15个字符] – 2013-05-14 11:07:31