2016-01-26 17 views
9

Tôi đang cố gắng xây dựng một chuỗi hiệu ứng âm thanh rất đơn giản bằng cách sử dụng Core Audio cho iOS. Cho đến nay tôi đã thực hiện một chuỗi EQ - Compression - Limiter hoạt động hoàn hảo trong trình mô phỏng. Tuy nhiên trên thiết bị, ứng dụng gặp sự cố khi kết nối các nút với AVAudioEngine do sự không khớp rõ ràng trong các định dạng phần cứng đầu vào và đầu ra.Kết hợp các thiết lập phần cứng đầu vào và đầu ra cho AVAudioEngine

'com.apple.coreaudio.avfaudio', reason: 'required condition is false: 
IsFormatSampleRateAndChannelCountValid(outputHWFormat)' 

Lấy ví dụ cơ bản, Biểu đồ âm thanh của tôi như sau.

Mic -> Limiter -> Main Mixer (and Output) 

và đồ thị được phổ biến sử dụng

engine.connect(engine.inputNode!, to: limiter, format: engine.inputNode!.outputFormatForBus(0)) 
engine.connect(limiter, to: engine.mainMixerNode, format: engine.inputNode!.outputFormatForBus(0)) 

mà treo với ngoại lệ trên. Nếu tôi thay vì sử dụng định dạng của giới hạn khi kết nối với máy trộn

engine.connect(engine.inputNode!, to: limiter, format: engine.inputNode!.outputFormatForBus(0)) 
engine.connect(limiter, to: engine.mainMixerNode, format: limiter.outputFormatForBus(0)) 

treo ứng dụng với một kAudioUnitErr_FormatNotSupported lỗi

'com.apple.coreaudio.avfaudio', reason: 'error -10868' 

Trước khi kết nối các nút âm thanh trong động cơ, inputNode có 1 kênh và một tỷ lệ mẫu là 44.100Hz, trong khi outputNode có 0 kênh và tốc độ lấy mẫu là 0Hz (được suy ra bằng cách sử dụng outputFormatForBus (0) thuộc tính). Nhưng điều này có thể là do không có nút nào được kết nối với bộ trộn đầu ra? Đặt tỷ lệ mẫu ưu tiên trên AVAudioSession không có sự khác biệt.

Có điều gì tôi thiếu ở đây không? Tôi có quyền truy cập Microphone (xác nhận sử dụng AVAudioSession.sharedInstance(). RecordPermission()), và tôi đã thiết lập các AVAudioSession chế độ để ghi lại (AVAudioSession.sharedInstance(). SetCategory (AVAudioSessionCategoryRecord)).

Các giới hạn là một AVAudioUnitEffect khởi tạo như sau:

let limiter = AVAudioUnitEffect(audioComponentDescription: 
       AudioComponentDescription(
        componentType: kAudioUnitType_Effect, 
        componentSubType: kAudioUnitSubType_PeakLimiter, 
        componentManufacturer: kAudioUnitManufacturer_Apple, 
        componentFlags: 0, 
        componentFlagsMask: 0)) 
engine.attachNode(limiter) 

và động cơ là một toàn cầu, lớp biến

var engine = AVAudioEngine() 

Như tôi đã nói, việc này hoàn toàn tốt đẹp bằng cách sử dụng mô phỏng (và Phần cứng mặc định của Mac), nhưng liên tục gặp sự cố trên nhiều iPad khác nhau trên iOS8 & iOS9. Tôi có một ví dụ làm việc siêu cơ bản mà chỉ đơn giản thức ăn đầu vào mic để một cầu thủ cho bộ trộn đầu ra

do { 
    file = try AVAudioFile(forWriting: NSURL.URLToDocumentsFolderForName(name: "test", WithType type: "caf")!, settings: engine.inputNode!.outputFormatForBus(0).settings) 
} catch {} 
engine.connect(player, to: engine.mainMixerNode, format: file.processingFormat) 

Ở đây inputNode có 1 kênh và tỷ lệ lấy mẫu 44.100Hz, trong khi outputNode có 2 kênh và tỷ lệ lấy mẫu 44.100Hz nhưng không có sự không khớp nào xảy ra. Do đó vấn đề phải là cách thức mà AVAudioUnitEffect được kết nối với bộ trộn đầu ra.

Mọi trợ giúp sẽ được đánh giá cao.

+0

Bạn đã bao giờ tìm ra điều này chưa? – user3344977

+1

AVAUdio là một cơn đau khủng khiếp ở phía sau, tài liệu được viết kém và động cơ hoạt động theo các quy tắc thực sự tối nghĩa và các mã lỗi không hữu ích. Nó hút, nhưng chúng tôi phải cày về phía trước. Tôi sẽ đăng câu trả lời nếu tôi giải quyết nó. – Josh

+0

bạn có dự án tái tạo điều này không? –

Trả lời

12

Điều này phụ thuộc vào một số yếu tố bên ngoài mã bạn đã chia sẻ, nhưng có thể bạn đang sử dụng danh mục AVAudioSession sai.

Tôi gặp vấn đề tương tự, trong một số trường hợp hơi khác nhau. Khi tôi đang sử dụng AVAudioSessionCategoryRecord làm thể loại AVAudioSession, tôi đã gặp phải vấn đề tương tự khi cố kết nối một vòi âm thanh. Tôi không chỉ nhận được lỗi đó, nhưng AVAudioEngine inputNode của tôi cho thấy một outputFormat với tỷ lệ mẫu 0.0.

Thay đổi thành AVAudioSessionCategoryPlayAndRecord Tôi đã nhận được tỷ lệ mẫu 44.100Hz dự kiến ​​và sự cố được giải quyết.

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