Получение NSData из музыкального файла в iPhone
Я получил все музыкальные и видео с моего устройства iPhone. Теперь я застрял в сохранении их в моем приложении, я не могу получить необработанные данные из файла. Может ли кто-нибудь помочь мне найти решение для этого. это код, который я использовал для получения музыкальных файлов.
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
, Любое решение для этого. заранее спасибо
1 ответ
Это не тривиальная задача - SDK от Apple часто не предоставляют простые 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.
Смотрите оригинальный исходный код здесь.