Преобразование MPMediaItem в NSData

Я пытаюсь преобразовать объект MPMediaItem в объект NSData, чтобы воспроизвести его с помощью AVAudioPlayer. Следующий ответ был опубликован некоторое время назад на аналогичный вопрос с инструкциями о том, как это сделать:

Необработанные данные песни MPMediaItems

Конечно, вы можете получить доступ к данным MPMediaItem. Это не кристально ясно сразу, но это работает. Вот как:

Получить URL-адрес элемента мультимедиа из его свойства MPMediaItemPropertyAssetURL Инициализировать AVURLAsset с помощью этого URL-адреса Инициализировать AVAssetReader с помощью этого актива Получить AVAssetTrack, который вы хотите прочитать из AVURLAsset Создать AVAssetReaderTrackOutput с этой дорожкой Добавить этот вывод в AVAssetReader, созданный ранее, и -startReading Получить все данные с AVAssetReaderTrackOutput's -copyNextSampleBuffer ПРИБЫЛЬ!

После извлечения данных с помощью «copyNextSampleBuffer» у меня теперь есть объект CMSampleBufferRef. Как мне продолжить отсюда?

Спасибо, Гили.


person Gili    schedule 24.05.2011    source источник


Ответы (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;
             }
         }
     }];
}
person Sargis    schedule 11.07.2017

Попробуйте использовать следующий код

 MPMediaItem *item;
 NSData *dataMedia = [NSData dataWithContentsOfURL:[item valueForProperty:MPMediaItemPropertyAssetURL]];
person Kuntal Gajjar    schedule 04.06.2012