2014-02-05 181 views
4

我正在尝试从.m4v视频中提取音频文件。它显示了错误一样,从.m4v视频文件中提取音频时出错

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x15e350d0 {NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x15d1c6b0 "The operation couldn’t be completed. (OSStatus error -12124.)", NSLocalizedFailureReason=An unknown error occurred (-12124)} 

这是我的代码:

-(void)extractAudioFromVideo{ 

    //Create a audia composition and add audio track 
    AVMutableComposition *newAudioAsset = [AVMutableComposition composition]; 
    AVMutableCompositionTrack *dstCompositionTrack = [newAudioAsset addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

    //Get video asset from which the audio should be extracted 
    NSURL *url  = [[NSBundle mainBundle] URLForResource:@"sample_iPod" withExtension:@"m4v"]; 
    AVAsset *srcAsset = [AVAsset assetWithURL:url]; 

    NSArray *trackArray = [srcAsset tracksWithMediaType:AVMediaTypeAudio]; 
    if(!trackArray.count){ 
     NSLog(@"Track returns empty array for mediatype AVMediaTypeAudio"); 
     return; 
    } 

    AVAssetTrack *srcAssetTrack = [trackArray objectAtIndex:0]; 

    //Extract time range 
    CMTimeRange timeRange = srcAssetTrack.timeRange; 

    //Insert audio from the video to mutable avcomposition track 
    NSError *err = nil; 
    if(NO == [dstCompositionTrack insertTimeRange:timeRange ofTrack:srcAssetTrack atTime:kCMTimeZero error:&err]){ 
     NSLog(@"Failed to insert audio from the video to mutable avcomposition track"); 
     return; 
    } 

    //Export the avcompostion track to destination path 
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0]; 
    NSString *dstPath = [documentsDirectory stringByAppendingString:@"sample_audio.mp4"]; 
    NSURL *dstURL = [NSURL fileURLWithPath:dstPath]; 


    //Remove if any file already exists 
    [[NSFileManager defaultManager] removeItemAtURL:dstURL error:nil]; 

    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:newAudioAsset presetName:AVAssetExportPresetPassthrough]; 
    NSLog(@"support file types= %@", [exportSession supportedFileTypes]); 
    exportSession.outputFileType = @"public.mpeg-4"; 
    exportSession.outputURL = dstURL; 

    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
     AVAssetExportSessionStatus status = exportSession.status; 

     if(AVAssetExportSessionStatusCompleted != status){ 
      NSLog(@"Export status not yet completed. Error: %@", exportSession.error.description); 
     } 
    }]; 
} 

我怎样才能解决这个问题?

回答

2

我已经在模拟器中测试过你的代码。它在模拟器(IOS7)中工作正常。但是当我在iPodTouch-5上运行时,它会像您提到的那样显示错误。花了超过15分钟,发现和愚蠢的错误。

获得如下路径(Documentssample_audio.mp4)当我在设备运行..

@"file:///var/mobile/Applications/A1E1D85F-0198-4A0C-80F8-222F0DA1C31A/Documentssample_audio.mp4" 

所以我修改路径..

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0]; 
NSString *dstPath = [documentsDirectory stringByAppendingString:@"/sample_audio.mp4"]; 

现在我下面越来越路径( /Documents/sample_audio.mp4)并且工作正常。但我不知道,怎么回事

@"file:///var/mobile/Applications/A1E1D85F-0198-4A0C-80F8-222F0DA1C31A/Documents/sample_audio.mp4"