【问题标题】:Converting MPMediaItem to NSData将 MPMediaItem 转换为 NSData
【发布时间】:2011-09-01 01:25:25
【问题描述】:
我正在尝试将 MPMediaItem 转换为 NSData 对象,以便可以使用 AVAudioPlayer 播放它。
以下答案是不久前在类似问题上发布的,并提供了如何解决的步骤:
MPMediaItems raw song data
当然你可以访问一个
MPMediaItem。这不是很清楚
一次,但它有效。方法如下:
从它的
MPMediaItemPropertyAssetURL 属性
用这个 URL 初始化一个 AVURLAsset
用这个初始化一个 AVAssetReader
资产获取你想要的 AVAssetTrack
从 AVURLAsset 读取创建一个
AVAssetReaderTrackOutput 与此
track 将此输出添加到
之前创建的 AVAssetReader 和
-startReading 使用 AVAssetReaderTrackOutput 获取所有数据
-copyNextSampleBuffer 利润!
使用“copyNextSampleBuffer”获取数据后,我现在有了一个 CMSampleBufferRef 对象。我该如何从这里继续?
谢谢,
吉利
【问题讨论】:
标签:
ios
avaudioplayer
mpmediaitem
【解决方案1】:
尝试使用以下代码
MPMediaItem *item;
NSData *dataMedia = [NSData dataWithContentsOfURL:[item valueForProperty:MPMediaItemPropertyAssetURL]];
【解决方案2】:
试试这个:
-(void)mediaItemToData : (MPMediaItem * ) curItem
{
NSURL *url = [curItem valueForProperty: MPMediaItemPropertyAssetURL];
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL: url options:nil];
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset: songAsset
presetName:AVAssetExportPresetAppleM4A];
exporter.outputFileType = @"com.apple.m4a-audio";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * myDocumentsDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
[[NSDate date] timeIntervalSince1970];
NSTimeInterval seconds = [[NSDate date] timeIntervalSince1970];
NSString *intervalSeconds = [NSString stringWithFormat:@"%0.0f",seconds];
NSString * fileName = [NSString stringWithFormat:@"%@.m4a",intervalSeconds];
NSString *exportFile = [myDocumentsDirectory stringByAppendingPathComponent:fileName];
NSURL *exportURL = [NSURL fileURLWithPath:exportFile];
exporter.outputURL = exportURL;
// do the export
// (completion handler block omitted)
[exporter exportAsynchronouslyWithCompletionHandler:
^{
int exportStatus = exporter.status;
switch (exportStatus)
{
case AVAssetExportSessionStatusFailed:
{
NSError *exportError = exporter.error;
NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError);
break;
}
case AVAssetExportSessionStatusCompleted:
{
NSLog (@"AVAssetExportSessionStatusCompleted");
NSData *data = [NSData dataWithContentsOfFile: [myDocumentsDirectory
stringByAppendingPathComponent:fileName]];
//DLog(@"Data %@",data);
data = nil;
break;
}
case AVAssetExportSessionStatusUnknown:
{
NSLog (@"AVAssetExportSessionStatusUnknown"); break;
}
case AVAssetExportSessionStatusExporting:
{
NSLog (@"AVAssetExportSessionStatusExporting"); break;
}
case AVAssetExportSessionStatusCancelled:
{
NSLog (@"AVAssetExportSessionStatusCancelled"); break;
}
case AVAssetExportSessionStatusWaiting:
{
NSLog (@"AVAssetExportSessionStatusWaiting"); break;
}
default:
{
NSLog (@"didn't get export status"); break;
}
}
}];
}