2015-08-16 14 views
12

Tôi có tệp âm thanh mà tôi muốn xử lý bằng một số hiệu ứng (như hiệu ứng quảng cáo chiêu hàng) và sau đó ghi kết quả cuối cùng vào tệp.Xuất tệp âm thanh sau khi thêm hiệu ứng

Trước khi xử lý tệp và lưu tệp vào đĩa, tôi cho phép người dùng chơi với hiệu ứng quảng cáo chiêu hàng và lắng nghe những thay đổi trong thời gian thực.

đây là cách tôi làm những thứ theo thời gian thực:

let audioSession = AVAudioSession.sharedInstance() 
    audioSession.setCategory(AVAudioSessionCategoryPlayback, error: nil) 
    audioSession.setActive(true, error: nil) 

    audioEngine = AVAudioEngine() 
    audioFile = AVAudioFile(forReading: audioUrl!, error: nil) 

    audioPlayerNode = AVAudioPlayerNode() 
    audioEngine.attachNode(audioPlayerNode) 

    changePitchEffect = AVAudioUnitTimePitch() 
    changePitchEffect.pitch = 1.0 // default 
    audioEngine.attachNode(changePitchEffect) 

    audioEngine.connect(audioPlayerNode, to: changePitchEffect, format: nil) 
    audioEngine.connect(changePitchEffect, to: audioEngine.outputNode, format: nil) 

    let frameCapacity = UInt32(audioFile.length) 
    let buffer = AVAudioPCMBuffer(PCMFormat: audioFile.processingFormat, frameCapacity: frameCapacity) 
    if audioFile.readIntoBuffer(buffer, error: nil) { 

     audioEngine.startAndReturnError(nil) 

     audioPlayerNode.scheduleBuffer(buffer, atTime: nil, options: .Loops, completionHandler: nil) 

     audioPlayerNode.play() // start playing in a loop 
    } 

sau đó sử dụng một UISlider tôi cho phép người dùng thay đổi giá trị của sân trong khi nghe âm thanh trong một vòng lặp.

Vì vậy, khi người dùng kết thúc chơi với quảng cáo chiêu hàng và nhấn vào nút tiếp theo, tôi cần lưu tệp âm thanh với giá trị độ cao đã chọn.

Câu hỏi của tôi là, làm cách nào để tạo tệp âm thanh mới có hiệu ứng quảng cáo chiêu hàng?

Tôi không muốn ghi lại khi người dùng đang nghe âm thanh và chơi với các hiệu ứng sân, tôi chỉ muốn xuất kết quả cuối cùng (không chơi các tập tin tất nhiên)

Trả lời

6

Kể từ khi sử dụng AVAudioSession là không phải là một yêu cầu rõ ràng trong tiêu đề của câu hỏi, có 2 câu trả lời có thể:

Chơi thông qua các nút (với AVAudioSession)

Cài đặt một tap vào nút. Xem AV Foundation Framework Reference.

audioPlayerNode.installTapOnBus(0, bufferSize:frameLength, format: audioInputNode.outputFormatForBus(0), block: {(buffer, time) in 
    let channels = UnsafeArray(start: buffer.floatChannelData, length: Int(buffer.format.channelCount)) 
    let floats = UnsafeArray(start: channels[0], length: Int(buffer.frameLength)) 

    for var i = 0; i < Int(self.audioBuffer.frameLength); i+=Int(self.audioMixerNode.outputFormatForBus(0).channelCount) 
    { 
     // process 
    } 
}) 

Cơ chế nhấn AVAudioSession yêu cầu chơi mặc dù. Tìm hiểu thêm về ghi âm khi đang phát trên Stack Overflow answer theo @matt.


Sử dụng AudioUnit (không AVAudioSession)

Khởi tạo một AudioSession với AudioSessionInitialize để chơi & kỷ lục, thiết lập một đọc & ghi dòng, và vượt qua một AURenderCallbackStruct trỏ đến mã xử lý dữ liệu của bạn. Điều này, tuy nhiên, ngăn cản bạn từ viết hoa khi AVAudioUnitTimePitch. Bạn có thể tìm hiểu thêm về giải pháp này trong bài viết How to do realtime recording with effect processing on iOS này.

+0

10x để nhận xét yr nhưng liên quan đến tùy chọn đầu tiên, như tôi đã viết, tôi không muốn ghi trong khi phát. tùy chọn thứ hai không rõ ràng với tôi và tôi hiểu rằng tôi sẽ không thể sử dụng hiệu ứng quảng cáo chiêu hàng – Eyal

Các vấn đề liên quan