簡體   English   中英

從.m4v視頻文件中提取音頻時出錯

[英]Error in extracting audio from .m4v video file

我正在嘗試從.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);
        }
    }];
}

我該如何解決這個錯誤?

我已經在模擬器中測試了你的代碼。 它在模擬器(IOS7)中運行良好。 但是當我在iPodTouch-5上運行時,它會像你提到的那樣顯示錯誤。 花了超過15分鍾,發現和愚蠢的錯誤。

我在Device中運行時獲取如下路徑( 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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM