2013-03-21 39 views
10

Tôi có ứng dụng iOS phát các hiệu ứng âm thanh khác nhau và ghi lại âm thanh cùng một lúc. Mục đích của ứng dụng hiện không quan trọng, nhưng tôi đang gặp vấn đề với các hiệu ứng âm thanh cổ phiếu iOS.Âm thanh hệ thống iOS với các phiên âm thanh tùy chỉnh

Để phát các hiệu ứng, tôi sử dụng SimpleAudioEngine từ CocosDenshion API (sử dụng AVAudioPlayer, theo như tôi có thể thấy). Các hiệu ứng được tải trước và chúng hoạt động tốt (tôi thực sự chơi chúng trên các nút, cuộn và tương tự). Hiệu ứng được chơi với đoạn mã sau:

Trong willFinishLaunchingWithOptions phương pháp:

[[SimpleAudioEngine sharedEngine] preloadEffect:@"sound.wav"]; 

Trong các phương pháp khác khi chơi được yêu cầu:

[[SimpleAudioEngine sharedEngine] playEffect:@"sound.wav"]; 

Không thắc mắc ở đây, nhưng cùng một lúc, tôi ghi âm nhiễu từ micrô tích hợp với API AVCaptureSession. Mã phiên chụp là từ một trong các ví dụ được tìm thấy trên web.

AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; 

captureSession = [[AVCaptureSession alloc] init]; 

NSError *error = nil; 
captureAudioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error]; 

if ([captureSession canAddInput: captureAudioDeviceInput]) 
{ 
    [captureSession addInput:captureAudioDeviceInput]; 
} 

captureAudioDataOutput = [AVCaptureAudioDataOutput new]; 

if ([captureSession canAddOutput:captureAudioDataOutput]) 
{ 
    [captureSession addOutput:captureAudioDataOutput]; 
} 

// Create a serial dispatch queue and set it on the AVCaptureAudioDataOutput object 
dispatch_queue_t audioDataOutputQueue = dispatch_queue_create("AudioDataOutputQueue", DISPATCH_QUEUE_SERIAL); 

[captureAudioDataOutput setSampleBufferDelegate:self queue:audioDataOutputQueue]; 
dispatch_release(audioDataOutputQueue); 

[captureSession startRunning]; 

Cả hai phần của mã đều hoạt động hoàn hảo từng cái một. Nhưng khi cả hai được kích hoạt cùng một lúc, một trong số chúng bị phá vỡ. Ví dụ: micrô đang đọc dữ liệu mà không gặp sự cố, cho đến khi một hiệu ứng âm thanh được phát. Tôi tìm thấy một khoảng cách này, để kích hoạt mixWithOthers thể loại, mà được thực hiện với đoạn mã sau:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil]; 
UInt32 doSetProperty = 1; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty); 
[[AVAudioSession sharedInstance] setActive: YES error: nil]; 

này được thực hiện trước khi tạo AVCaptureDeviceAVCaptureSession. Ứng dụng hoạt động như mong muốn, âm thanh được phát và micrô đọc dữ liệu. Các nút phần cứng cũng đang hoạt động trên CocosDenshion SimpleAudioEngine (tắt tiếng và âm lượng).

Nhưng rõ ràng, ứng dụng có lỗi.

Khi tắt tiếng tắt tiếng và ứng dụng đang phát âm thanh, nhấn bàn phím iOS âm thanh trên TextField không được phát. Tôi muốn các âm thanh nhấp để phát.

Tôi đã gỡ lỗi mã một chút và có vẻ như nó có liên quan đến Cài đặt phiên âm thanh. Nếu tôi đặt danh mục thành AVAudioSessionCategorySoloAmbient, âm thanh nhấp được phát, nhưng với âm lượng rất thấp (âm lượng sẽ được tăng tối đa và âm thanh ứng dụng phát ra ở âm lượng tối đa chỉ độc đáo). Và nó mang lại một vấn đề khác, SoloAmbient hủy bỏ CaptureSession của tôi, điều này là dễ hiểu.

Tôi đang thử nghiệm ứng dụng trên iPhone 5, nhưng điều tương tự cũng xảy ra trên trình mô phỏng.

Vì vậy, tôi đang làm gì sai với cài đặt? Làm thế nào tôi có thể sửa chữa các thiết lập để tôi giữ cho tất cả các phiên âm thanh của tôi hoạt động và giữ cho hệ thống iOS âm thanh?

Cảm ơn bạn!

+0

Bạn đã thử đặt danh mục thành PlayAndRecord chưa? Nếu bạn muốn chơi và ghi âm cùng một lúc, bạn sẽ cần phải làm điều đó. – Mar0ux

+0

Tôi đã thử trước khi đặt câu hỏi. Danh mục PlayAndRecord làm cho âm thanh phát ở âm lượng thấp hơn, nhưng không ** mang lại âm thanh bàn phím bị thiếu. – Legoless

Trả lời

1

Kiểm tra câu hỏi của tôi tại đây: https://stackoverflow.com/questions/15680503/how-to-get-the-audio-level-of-the-microphone-without-disabling-system-sounds

Không có câu trả lời nào đáng tiếc.Âm thanh hệ thống bị tắt theo mặc định khi đang ghi âm. Tôi hy vọng điều này là để ngăn chặn chúng được ghi lại do nhầm lẫn, mà trong hầu hết trường hợp sẽ là những gì bạn muốn.

Bạn có thể triển khai giao thức UITextFieldDelegate và phát lần nhấp của riêng bạn mỗi lần textField:shouldChangeCharactersInRange:replacementString: được gọi, có thể.

+0

Điểm tốt, tôi phải nói. Tuy nhiên tôi muốn các nhấp chuột được phát. Tôi đã triển khai giải pháp thay thế mà bạn đề xuất nhưng cảm ơn bạn đã trả lời. – Legoless

+1

Liên kết bạn có ở trên để xem câu hỏi của bạn bị hỏng. –