2012-07-19 73 views
1

我正在使用this教程将音乐库中的歌曲传到我指定的目录。它对我来说工作正常,但其他人报告说,这首歌永远不会到达那里。起初我认为有设备限制,但似乎与我具有相同设备的人有问题。这有点令人讨厌,因为我无法重现他们的问题。AVAssetReader/Writer只能在某些设备上工作?

这里是我的代码:

{ 
    NSURL *assetURL = [song valueForProperty:MPMediaItemPropertyAssetURL]; 
    AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 

    NSError *assetError = nil; 
    AVAssetReader *assetReader = [[AVAssetReader assetReaderWithAsset:songAsset 
                   error:&assetError] 
            retain]; 
    if (assetError) { 
     NSLog (@"error: %@", assetError); 
     return; 
    } 

    AVAssetReaderOutput *assetReaderOutput = [[AVAssetReaderAudioMixOutput 
               assetReaderAudioMixOutputWithAudioTracks:songAsset.tracks 
               audioSettings: nil] 
               retain]; 
    if (! [assetReader canAddOutput: assetReaderOutput]) { 
     NSLog (@"can't add reader output... die!"); 
     return; 
    } 
    [assetReader addOutput: assetReaderOutput]; 


    NSString *exportPath = @"Library/PreferenceBundles/MyAlarmSettings.bundle/export.m4a"; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath]) { 
     [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil]; 
    } 

    NSURL *exportURL = [NSURL fileURLWithPath:exportPath]; 
    AVAssetWriter *assetWriter = [[AVAssetWriter assetWriterWithURL:exportURL 
                  fileType:AVFileTypeAppleM4A 
                   error:&assetError] 
            retain]; 
    if (assetError) { 
     NSLog (@"error: %@", assetError); 
     return; 
    } 
    AudioChannelLayout channelLayout; 
    memset(&channelLayout, 0, sizeof(AudioChannelLayout)); 
    channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo; 

    NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
            [ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, 
            [ NSNumber numberWithInt: 2 ], AVNumberOfChannelsKey, 
            [ NSNumber numberWithFloat: 44100.0 ], AVSampleRateKey, 
            [ NSData dataWithBytes:&channelLayout length: sizeof(AudioChannelLayout) ], AVChannelLayoutKey, 
            [ NSNumber numberWithInt: 320000 ], AVEncoderBitRateKey, 
            nil];     


    AVAssetWriterInput *assetWriterInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio 
                       outputSettings:outputSettings] 
              retain]; 
    if ([assetWriter canAddInput:assetWriterInput]) { 
     [assetWriter addInput:assetWriterInput]; 
    } else { 
     NSLog (@"can't add asset writer input... die!"); 
     return; 
    } 

    assetWriterInput.expectsMediaDataInRealTime = NO; 

    [assetWriter startWriting]; 
    [assetReader startReading]; 

    AVAssetTrack *soundTrack = [songAsset.tracks objectAtIndex:0]; 
    CMTime startTime = CMTimeMake (0, soundTrack.naturalTimeScale); 
    [assetWriter startSessionAtSourceTime: startTime]; 

    __block UInt64 convertedByteCount = 0; 

    dispatch_queue_t mediaInputQueue = dispatch_queue_create("mediaInputQueue", NULL); 
    [assetWriterInput requestMediaDataWhenReadyOnQueue:mediaInputQueue 
              usingBlock:^
    { 
     // NSLog (@"top of block"); 
     while (assetWriterInput.readyForMoreMediaData) { 
      CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer]; 
      if (nextBuffer) { 
       // append buffer 
       [assetWriterInput appendSampleBuffer: nextBuffer]; 
       //    NSLog (@"appended a buffer (%d bytes)", 
       //     CMSampleBufferGetTotalSampleSize (nextBuffer)); 
       convertedByteCount += CMSampleBufferGetTotalSampleSize (nextBuffer); 
       // oops, no 
       // sizeLabel.text = [NSString stringWithFormat: @"%ld bytes converted", convertedByteCount]; 

       NSNumber *convertedByteCountNumber = [NSNumber numberWithLong:convertedByteCount]; 
       [self performSelectorOnMainThread:@selector(updateSizeLabel:) 
             withObject:convertedByteCountNumber 
            waitUntilDone:NO]; 
      } else { 
       // done! 

       NSString *songtitle = [[NSString alloc]initWithFormat:@"Alarm sound set to '%@' \n \n Press OK to respring. ",[song valueForProperty:MPMediaItemPropertyTitle]]; 

       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Done!" message:songtitle delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
       [alert show]; 
       [alert release]; 



       [assetWriterInput markAsFinished]; 
       [assetWriter finishWriting]; 
       [assetReader cancelReading]; 
       NSDictionary *outputFileAttributes = [[NSFileManager defaultManager] 
                 attributesOfItemAtPath:exportPath 
                 error:nil]; 
       NSLog (@"done. file size is %llu", 
         [outputFileAttributes fileSize]); 
       NSNumber *doneFileSize = [NSNumber numberWithLong:[outputFileAttributes fileSize]]; 
       [self performSelectorOnMainThread:@selector(updateCompletedSizeLabel:) 
             withObject:doneFileSize 
            waitUntilDone:NO]; 
       // release a lot of stuff 


       [assetReader release]; 
       [assetReaderOutput release]; 
       [assetWriter release]; 
       [assetWriterInput release]; 
       [exportPath release]; 
       break; 
      } 
     } 

    }]; 

    NSLog (@"bottom of convertTapped:"); 
} 
+0

你能对你的意思是“什么阐述这首歌永远不会有“?我知道用户可以是非特定的,但如果还有什么可以告诉我们关于症状的信息,那将会有所帮助。谢谢。 – Nate 2012-07-20 22:48:02

+0

喜欢这首歌永远不会被导出到我想要的路径。对我来说,它工作正常,并在Library/PreferenceBundles/MyAlarmSettings.bundle /我找到音频文件,但对于其他一些export.m4a不存在。无论如何,我现在正在使用一种新方法,所以我不在乎。 – Fire30 2012-07-21 02:24:04

回答

1

如果您正在访问来自用户的iPod库mediaItems他们也许在云中。使用

[self.mediaItem valueForProperty:MPMediaItemPropertyIsCloudItem]

据我知道你不能访问这些资产,或迫使他们流

相关问题