2012-09-08 1 views
0

J'essaie de copier un élément de la bibliothèque de l'iPod vers mon espace de stockage local - pour une lecture ultérieure. J'ai l'article URl mais c'est (ipod-library: //item/item.mp3? Id = 2398084975506389321) aucune idée comment accéder au fichier réel?Copier l'élément de la bibliothèque de l'iPod

Merci, Rick

Répondre

1

Cela fonctionne https://gist.github.com/3304992

-(void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection{ 
    NSString *tempPath = NSTemporaryDirectory(); 
    int i=1; 
    for (MPMediaItem *theItem in mediaItemCollection.items) { 
     NSURL *url = [theItem valueForProperty:MPMediaItemPropertyAssetURL]; 
     AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:url options:nil]; 
     AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset: songAsset presetName: AVAssetExportPresetPassthrough]; 
     exporter.outputFileType = @"com.apple.coreaudio-format"; 
     NSString *fname = [[NSString stringWithFormat:@"%d",i] stringByAppendingString:@".caf"]; 
     ++i; 
     NSString *exportFile = [tempPath stringByAppendingPathComponent: fname]; 
     exporter.outputURL = [NSURL fileURLWithPath:exportFile]; 
     [exporter exportAsynchronouslyWithCompletionHandler:^{ 
      //Code for completion Handler 
     }]; 
    } 
    [picker dismissViewControllerAnimated:YES completion:Nil]; 
} 

utilisation MPMediaPickerController pour choisir les médias

+0

public void ItemsPicked (expéditeur d'objet, ItemsPickedEventArgs e) { MPMediaItem [] mediaItems; NSUrl mediaURL = nouveau NSUrl(); mediaItems = e.MediaItemCollection.Items; mediaURL = (NSUrl) mediaItems [0] .ValueForProperty (MPMediaItemProperty.AssetUrl); asset = AVUrlAsset.FromUrl (mediaURL, null); exportURL = NSUrl.FromFilename (Path.Combine (appDelegate.store.mediaPath, "tmp.m4a")); export = new AVAssetExportSession (asset, AVAssetExportSession.PresetAppleM4A); export.OutputFileType = AVFileType.AppleM4A; export.OutputUrl = exportURL; export.ExportAsynchronously (CopyComplete); } – Rick

1

Voilà comment je le fais en Objective-C:

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

// or [NSURL URLWithString:@"ipod-library://item/item.mp3?id=2398084975506389321"] 
NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL]; 
NSMutableData *data = [[NSMutableData alloc] init]; 

const uint32_t sampleRate = 16000; 
const uint16_t bitDepth = 16; 
const uint16_t channels = 2; 

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]; 

Ici data contiendra les données PCM brutes de la piste. S'il vous plaît noter que vous ne pouvez pas accéder directement au fichier d'une chanson ou une vidéo, seulement ses données grâce à cette méthode. Vous pouvez le compresser en utilisant e. g. FLAC (that's how I'm processing it in my tweak).

Étant donné que MonoTouch a un mappage 1: 1 avec les noms de classe et de méthode Objective-C, il devrait être assez facile à copier. :)

+0

Il fonctionne très bien pour moi quand j'ai supprimé l'option de réglage. – Muzammil

Questions connexes