2010-06-23 39 views
8

tôi gặp sự cố với AVAudioRecorder và AVAudioPlayer.AVAudioRecorder & AVAudioPlayer - Đầu ra âm thanh trên loa trong, cách thay đổi?

khi tôi sử dụng Trình phát và Ghi cùng một lúc (ví dụ: để phát âm thanh trong khi quay) âm thanh nằm trong Loa trong yên tĩnh. tôi đã tìm kiếm stackoverflow và tất cả tôi tìm thấy là mã này:

UInt32 *audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

Nhưng điều này không giúp tôi :( Khi tôi copyPaste nó, tôi đã nhận lỗi gì tôi có thể làm gì để ghi lại và chơi loa lớn tại. đáy?

tôi không sử dụng bất cứ điều gì như SCLister oder một cái gì đó ...

Cảm ơn trước

Max

Trả lời

1

Chỉ có điều tôi đã tìm thấy về chủ đề này là thế này:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 

mà phải được thiết lập khi bạn ghi lại âm thanh của bạn nếu bạn muốn chơi lại cùng một lúc. Hãy thử điều đó và xin hãy biết.

P.S. Đảm bảo bạn thêm các khung công tác AudioToolboxAVFoundation vào dự án của mình và đưa chúng vào tệp .m của bạn.

+1

Vâng, điều này là cần thiết, nhưng tôi hiểu rồi. Không có thay đổi: ( Chức năng chính nó là không sao, bạn có thể thổi mic và nghe âm thanh, nhưng chỉ với loa trong. –

16

Đây là một chút cũ, nhưng bài đăng này đã giúp tôi và tôi muốn cập nhật nó cho bất kỳ ai khác có thể cần đến nó trong tương lai. Mã được đăng ở trên cùng là chính xác - nó sẽ lấy âm thanh yên tĩnh đang được phát qua loa điện thoại và định tuyến âm thanh tới loa ở phía dưới. Có một lỗi đánh máy nhỏ trong mã, đó là lý do tại sao nó đưa ra lỗi. Dưới đây là đúng đoạn mã mà sẽ giải quyết vấn đề này:

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

Hãy chắc chắn rằng bạn cũng kích hoạt các phiên âm thanh ngay sau khi thiết lập này, trước khi tạo âm thanh của bạn nghe nhạc/ghi:

[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

Cuối cùng, nếu bạn sẽ được chơi và ghi âm cùng một lúc bạn có thể sẽ cần phải thiết lập các thể loại và chức năng trộn quá. Đây là toàn bộ đoạn mã sẽ đặt danh mục, cho phép trộn, định tuyến âm thanh đến loa chính và kích hoạt phiên. Bạn sẽ chỉ muốn làm điều này một lần ngay sau khi ứng dụng khởi chạy.

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 

OSStatus propertySetError = 0; 
UInt32 allowMixing = true; 
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); 

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

NSLog(@"Mixing: %x", propertySetError); // This should be 0 or there was an issue somewhere 

[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

Hy vọng sẽ giúp ai đó!

+0

bằng cách này, nó phải là 'lỗi: NULL' không' lỗi: nil' – user102008

+2

Có khá một chút của Apple mẫu mã trong đó cho thấy lỗi: nil cũng như lỗi: NULL vì vậy nó có vẻ là chấp nhận được để sử dụng, hoặc .. Nó chắc chắn sẽ không gây ra bất kỳ vấn đề .. –

+0

cảm ơn buddy Nó đã giúp tôi rất nhiều ...! – Warewolf

0

Nếu bạn hiện đang phát qua loa yên tĩnh, và muốn chơi qua loa phóng thanh ở dưới cùng của iPhone, sử dụng mã này:

UInt32 doChangeDefaultRoute = 1; 

AudioSessionSetProperty (
         kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, 
         sizeof (doChangeDefaultRoute), 
         &doChangeDefaultRoute 
         ); 
0

Đây là câu hỏi cũ, nhưng không ai trong số các các câu trả lời khác đã giúp tôi ... Tuy nhiên, tôi đã tìm thấy một giải pháp mà tôi đăng để tham khảo trong tương lai trong trường hợp ai đó cần đến nó.

Giải pháp được mô tả trong bài đăng trên blog sau đây: iOS: Force audio output to speakers while headphones are plugged in.

Bạn cần tạo AudioRouter lớp Objective-C mới trong dự án của mình. Sau đó, nhập AudioRouter.h vào tệp tiêu đề của lớp bạn đang bắt đầu chức năng âm thanh.Bây giờ trong file corrseponding .m thêm những dòng sau đây trong vòng viewDidLoad phương pháp:

AudioRouter *foobar = [[AudioRouter alloc] init]; 
[foobar initAudioSessionRouting]; 
[foobar forceOutputToBuiltInSpeakers]; 

Bây giờ bạn có âm thanh (ví dụ AVAudioPlayer) đầu ra buộc phải loa!

0

AudioSessionSetProperty không được dùng nữa kể từ iOS7 nhưng sau đây đã hoạt động đối với tôi.

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; 
2

tôi đã trả lời nó ở đây đã: How to get AVAudioPlayer output to the speaker

Nói tóm lại, dùng nó trước khi ghi:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil]; 

... và sử dụng này trước khi phát lại (trên loa hoặc tai nghe nếu họ được cắm vào)

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; 
+0

Bạn là người đàn ông! – CSawy

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