2015-05-08 15 views
5

Tôi đã xem xét tài liệu Swift để lưu đầu ra âm thanh từ AVAudioEngine nhưng tôi không thể tìm thấy bất kỳ mẹo hữu ích nào.
Bất kỳ đề xuất nào?SWIFT - Có thể lưu âm thanh từ AVAudioEngine hoặc từ AudioPlayerNode không? Nếu có, làm thế nào?

Giải pháp Tôi tìm thấy một cách để giải quyết câu trả lời của Matt. Dưới đây là một số mẫu mã như thế nào để lưu một âm thanh sau khi đi qua nó thông qua một AVAudioEngine (tôi nghĩ rằng về mặt kỹ thuật nó trước)

newAudio = AVAudioFile(forWriting: newAudio.url, settings: nil, error: NSErrorPointer()) 
//Your new file on which you want to save some changed audio, and prepared to be bufferd in some new data... 

var audioPlayerNode = AVAudioPlayerNode() //or your Time pitch unit if pitch changed 

//Now install a Tap on the output bus to "record" the transformed file on a our newAudio file. 
audioPlayerNode.installTapOnBus(0, bufferSize: (AVAudioFrameCount(audioPlayer.duration)), format: opffb){ 
     (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) in 

     if (self.newAudio.length) < (self.audioFile.length){//Let us know when to stop saving the file, otherwise saving infinitely 

     self.newAudio.writeFromBuffer(buffer, error: NSErrorPointer())//let's write the buffer result into our file 

     }else{ 
      audioPlayerNode.removeTapOnBus(0)//if we dont remove it, will keep on tapping infinitely 
      println("Did you like it? Please, vote up for my question") 
     } 

    } 

Hope this helps!

Một vấn đề để giải quyết:

Đôi khi, outputNode của bạn là ngắn hơn so với đầu vào: nếu bạn đẩy nhanh tốc độ thời gian bằng 2, âm thanh của bạn sẽ ngắn hơn 2 lần. Đây là vấn đề mà tôi đang gặp phải vì điều kiện lưu tệp của tôi là (dòng 10)

if(newAudio.length) < (self.audioFile.length)//audiofile being the original(long) audio and newAudio being the new changed (shorter) audio. 

Mọi trợ giúp ở đây?

+0

Ở đây: [Tài liệu của Apple xuất từ ​​AV] (https://developer.apple.com/library/prerelease/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/05_Export.html#//apple_ref/doc/uid/TP40010188-CH9-SW2) – Moritz

+0

Cảm ơn @eric D., tôi đang xem xét mã. Có vẻ như nó sẽ thực hiện công việc. Tuy nhiên, có rất nhiều điều tôi đang khám phá và nhiều dòng tôi phải hiểu. Có ổn không nếu tôi nêu lên câu hỏi? Ví dụ, làm thế nào tôi có thể tải một tài sản không phải là một AudioFile với URL nhưng một audioEngine hoặc AudioNode? Bạn đã bao giờ trải qua mã này chưa? – mlk

+0

Cá nhân, không thực sự, tôi chỉ nghĩ rằng bạn có thể đã bỏ lỡ tài liệu này, vì vậy tôi đã dán liên kết. Nhưng đó không phải là vấn đề: vấn đề là bạn không thể hỏi những câu hỏi quá rộng về SO. Và bình luận không phải là nơi cho điều này anyway. Tôi đề nghị bạn tạo một câu hỏi mới bao gồm mã hiện tại của bạn, cho thấy những gì bạn cố gắng đạt được và nơi bạn đấu tranh, hoặc bất cứ điều gì như thế. Oh, và * one * chủ đề cho mỗi bài đăng. Chào mừng bạn đến với SO, nhân tiện. :) – Moritz

Trả lời

5

Có, nó khá dễ dàng. Bạn chỉ cần đặt một vòi nước trên một nút và lưu bộ đệm vào một tệp.

Thật không may điều này có nghĩa là bạn phải phát thông qua nút. Tôi đã hy vọng rằng AVAudioEngine sẽ cho phép tôi xử lý một tập tin âm thanh trực tiếp vào một tập tin âm thanh khác, nhưng dường như điều đó là không thể - bạn phải chơi và xử lý theo thời gian thực.

+0

Cảm ơn người đàn ông, nó đã giúp tôi rất nhiều. Một điều, tôi không nghĩ rằng bạn cần phải chơi nếu bạn cài đặt vòi trên audioNode. Tôi chưa thử nó nhưng tôi thực sự không cần nó kể từ khi tôi chơi âm thanh anyway trước khi lưu nó. giống như kiểm tra sự tỉnh táo. – mlk

+0

Vâng, tôi sẽ thử lại lần nữa, nhưng trong thử nghiệm của tôi, tôi không thể lưu tệp mà không thực sự phát qua bộ đệm. – matt

1

Hiển thị ngoại tuyến Đã hoạt động cho tôi bằng GenericUnut AudioUnit. Xin vui lòng kiểm tra liên kết này, tôi đã thực hiện trộn hai, ba âm thanh offline và kết hợp nó vào một tập tin duy nhất. Không phải là kịch bản tương tự nhưng nó có thể giúp bạn để có được một số ý tưởng. core audio offline rendering GenericOutput

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