我一直在尋找一個解決方案,但到目前爲止我找不到它。從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)
}
謝謝你的回答,我的問題是沒有重現音頻,是之後我必須在一種定時循環播放它(音頻長度可能不同於循環長度) 這就是爲什麼我想使用AVAudioPl ayer –
你能發表一些代碼嗎? –
我添加了一些代碼,希望它不會讓它更難理解。 –