2012-09-27 21 views
5

तो मेरे पास दो ऑडियो फाइलें हैं, एक ही प्रारूप, संभावित रूप से अलग लंबाई। मैं इन फ़ाइलों को गठबंधन करना चाहता हूं (ऑडियो को एक से दूसरे पर ओवरले करें, अंत में उनसे जुड़ें नहीं)।मैं ऑडियो फ़ाइलों को ओवरलैप कैसे कर सकता हूं और एक्सकोड में आईफोन के लिए गठबंधन कर सकता हूं?

चलें कहते हैं कि मैं दो फ़ाइलें:

  1. ऑडियो फ़ाइल ए, लंबाई 30 सेकंड, आकार 220k
  2. ऑडियो फ़ाइल बी, लंबाई 45 सेकंड, आकार 300k

मैं क्या चाहते

  • जैसे, ऑडियो फ़ाइल को जोड़ती है:

    1. ऑडियो फ़ाइल सी, लंबाई 45 सेकंड, आकार 300k (मुझे यह पहचान सकता है कि यह और भी हो सकता है)

    हर किसी की मदद की सराहना करें!

  • +0

    हाय @ बीट, मुझे समस्या है कि ऑडियो फ़ाइल सी का फ़ाइल आकार बहुत बड़ा है। क्या आपको यह समस्या भी है? यदि हां, तो आप इसे कैसे हल करते हैं? thx – Newbie

    उत्तर

    4

    यहां मैंने अपने ऐप में क्या किया है।

    - (void) setUpAndAddAudioAtPath:(NSURL*)assetURL toComposition:(AVMutableComposition *)composition 
    { 
        AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 
    
        AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
        AVAssetTrack *sourceAudioTrack = [[songAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    
        NSError *error = nil; 
        BOOL ok = NO; 
    
        CMTime startTime = CMTimeMakeWithSeconds(0, 1); 
        CMTime trackDuration = songAsset.duration; 
        //CMTime longestTime = CMTimeMake(848896, 44100); //(19.24 seconds) 
        CMTimeRange tRange = CMTimeRangeMake(startTime, trackDuration); 
    
        //Set Volume 
        AVMutableAudioMixInputParameters *trackMix = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track]; 
        [trackMix setVolume:0.8f atTime:startTime]; 
        [self.audioMixParams addObject:trackMix]; 
    
        //Insert audio into track 
        ok = [track insertTimeRange:tRange ofTrack:sourceAudioTrack atTime:CMTimeMake(0, 44100) error:&error]; 
    } 
    
    
    - (IBAction)saveRecording 
    { 
        AVMutableComposition *composition = [AVMutableComposition composition]; 
         audioMixParams = [[NSMutableArray alloc] initWithObjects:nil]; 
    
        //IMPLEMENT FOLLOWING CODE WHEN WANT TO MERGE ANOTHER AUDIO FILE 
        //Add Audio Tracks to Composition 
        NSString *URLPath1 = [[NSBundle mainBundle] pathForResource:@"mysound" ofType:@"mp3"]; 
        NSString *URLPath2 = [[NSBundle mainBundle] pathForResource:@"mysound2" ofType:@"mp3"]; 
        NSURL *assetURL1 = [NSURL fileURLWithPath:URLPath1]; 
        [self setUpAndAddAudioAtPath:assetURL1 toComposition:composition]; 
    
        NSURL *assetURL2 = [NSURL fileURLWithPath:URLPath2]; 
        [self setUpAndAddAudioAtPath:assetURL2 toComposition:composition]; 
    
        AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
        audioMix.inputParameters = [NSArray arrayWithArray:audioMixParams]; 
    
        //If you need to query what formats you can export to, here's a way to find out 
        NSLog (@"compatible presets for songAsset: %@", 
          [AVAssetExportSession exportPresetsCompatibleWithAsset:composition]); 
    
        AVAssetExportSession *exporter = [[AVAssetExportSession alloc] 
                 initWithAsset: composition 
                 presetName: AVAssetExportPresetAppleM4A]; 
        exporter.audioMix = audioMix; 
        exporter.outputFileType = @"com.apple.m4a-audio"; 
        NSURL *exportURL = [NSURL fileURLWithPath:exportFile]; 
        exporter.outputURL = exportURL; 
    
    // do the export 
         [exporter exportAsynchronouslyWithCompletionHandler:^{ 
          int exportStatus = exporter.status; 
          NSError *exportError = exporter.error; 
    
          switch (exportStatus) { 
           case AVAssetExportSessionStatusFailed: 
    
            break; 
    
           case AVAssetExportSessionStatusCompleted: NSLog (@"AVAssetExportSessionStatusCompleted"); 
            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; 
          } 
         }]; 
    } 
    

    सावधान रहें कि मैंने कुछ समय पहले ऐसा किया था, और आपको इसे काम करने के लिए इसे थोड़ा सा काम करना पड़ सकता है। लेकिन यह एक बिंदु पर काम किया था। अगर आपको समस्याएं आ रही हैं तो मुझे बताएं।

    +0

    hi @ gg13, मैंने ऑडियो को मिश्रित करने के लिए आपके सुझाए गए तरीके का उपयोग किया है। लेकिन मेरी समस्या यह है कि निर्यात की गई फाइल मूल की तुलना में बहुत बड़ी है। फ़ाइल को एक छोटी फ़ाइल टाइप में प्रस्तुत करने का कोई तरीका है? – Newbie

    +0

    मैंने export.outputFileType को अन्य फ़ाइल प्रारूप जैसे AVFileTypeAIFC में बदलने की कोशिश की। हालांकि, यह त्रुटि फेंकता है। फिर मैंने निर्यातक की समर्थित FileTypes संपत्ति को पढ़ा, और मुझे पता चला कि यह केवल AVFileTypeAppleM4A (यानी "com.apple.m4a-audio" आपके द्वारा सुझाई गई फ़ाइल प्रकार का समर्थन करता है)। ऐसा क्यों है? – Newbie

    +0

    मुझे लगता है कि आप ट्रैकमिक्स के लिए वॉल्यूम 0.8 पर सेट कर रहे हैं। गुणवत्ता को दूषित करने से बचने के लिए यह एकमात्र कदम है? मुझे ऑडियो-मिश्रण का थोड़ा पता है, और फ़ाइलों को संयोजित करते समय मुझे खराब परिणाम मिल रहे हैं, इसलिए मैं कोशिश करूँगा, लेकिन क्या आपको पता है कि यह बिटरेट या कुछ बढ़ाने में मदद करता है? जैसे, अगर मैं 44.1 पर दो ऑडियो फाइलों का संयोजन कर रहा हूं, तो परिणाम बेहतर होगा यदि संयुक्त फ़ाइल 88.2 (या अधिक सामान्य 96) है, या ऐसा करने का कोई कारण नहीं होगा? – Sti

    0

    यदि चयनित संपत्ति में ऑडियो संपत्ति ट्रैक नहीं मिलता है। आप इस वीडियो का उपयोग विशेष वीडियो की ध्वनि की जांच के लिए कर सकते हैं।

    if([[songAsset tracksWithMediaType:AVMediaTypeAudio] firstObject]==NULL) 
    { 
        NSLog(@"Sound is not Present"); 
    } 
    else 
    { 
        NSLog(@"Sound is Present"); 
        //You will initalise all things 
        AVAssetTrack *sourceAudioTrack = [[songAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    
    }