2014-11-16 107 views
0

我一直在尋找一個解決方案,但到目前爲止我找不到它。從AVMutableComposition到AVAudioPlayer的iOS音頻轉換

現在我用AVMutableComposition創建一個音頻文件,並用AVAssetExportSession將它寫入磁盤,這樣我就可以用AVAudioPlayer加載它並在特定時間播放它。將其寫入磁盤需要很長時間的事實會減慢速度,並且在某些情況下會使我的應用程序非常慢。

音頻的創建部分需要很少的時間,所以我想知道是否可以將文件導出到磁盤,我可以像NSData那樣導出它,所以我可以在AVAudioPlayer中使用它,而無需從磁盤寫入/讀取


代碼 讓和聲= 「TEMP」 讓文件路徑= NSURL(fileURLWithPath:NSBundle.mainBundle()pathForResource(和聲,ofType: 「WAV」)!)

var songAsset = AVURLAsset(URL: filepath, options: nil) 

    var track = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID()) 
    var source: AnyObject = songAsset.tracksWithMediaType(AVMediaTypeAudio)[0] 

    var startTime = CMTimeMakeWithSeconds(0, 44100) 
    var time_insert = CMTimeMakeWithSeconds(atTime, 44100) 
    var trackDuration = songAsset.duration 
    var longestTime = CMTimeMake(882000, 44100) 
    var timeRange = CMTimeRangeMake(startTime, longestTime) 

    var trackMix = AVMutableAudioMixInputParameters(track: track) 
    trackMix.setVolume(volume, atTime: startTime) 
    audioMixParams.insert(trackMix, atIndex: audioMixParams.count) 

    track.insertTimeRange(timeRange, ofTrack: source as AVAssetTrack, atTime: time_insert, error: nil) 

這幾種情況蒂姆在一個循環中的ES生成一個整體的軌道

最後我用

var exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetAppleM4A) 
    exporter.audioMix = audioMix 
    exporter.outputFileType = "com.apple.m4a-audio" 
    exporter.outputURL = NSURL(fileURLWithPath: fileName) 

    exporter.exportAsynchronouslyWithCompletionHandler({ 
     switch exporter.status{ 
     case AVAssetExportSessionStatus.Failed: 
      println("failed \(exporter.error)") 
     case AVAssetExportSessionStatus.Cancelled: 
      println("cancelled \(exporter.error)") 
     default: 
      println("complete") 
      callback() 
     } 
    }) 

導出文件。

之後,它會調用加載聲音並在一段時間內循環播放的回調。

我不正常的循環性能循環的事實是,每個文件可能不具有相同的長度loopDuration

callback: { 

     self.fillSoundArray() 
     self.fillSoundArray() 
     self.fillSoundArray() 
    } 


private func fillSoundArray() { 
    var currentloop = self.current_loop++ 

    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString 
    var fileName = documentsPath + "/temp.mp4" 

    var tempAudio = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: fileName), error: nil) 
    if (self.start_time == 0) { 
     self.start_time = tempAudio.deviceCurrentTime 
    } 

    queue.insert(tempAudio, atIndex: queue.count) 
    tempAudio.prepareToPlay() 
    tempAudio.delegate = self 
    tempAudio.playAtTime(start_time + currentloop*self.loopDuration) 
} 

回答

1

使用AVPlayerItem & AVPlayer,使您的聲音組成的快速預覽

AVPlayerItem* previewPlayerItem = [[AVPlayerItem alloc] initWithAsset:mutableCompositionMain 
              automaticallyLoadedAssetKeys:@[@"tracks",@"duration"]]; 
previewPlayerItem.videoComposition = mutableVideoComposition; 
AVPlayer* previewPlayer = [[AVPlayer alloc] initWithPlayerItem:previewPlayerItem ]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(dismisPreviewPlayer:) 
              name:AVPlayerItemDidPlayToEndTimeNotification 
              object:[previewPlayer currentItem]]; 
+0

謝謝你的回答,我的問題是沒有重現音頻,是之後我必須在一種定時循環播放它(音頻長度可能不同於循環長度) 這就是爲什麼我想使用AVAudioPl ayer –

+0

你能發表一些代碼嗎? –

+0

我添加了一些代碼,希望它不會讓它更難理解。 –