2011-01-09 18 views
19

Tôi đang thử nghiệm ứng dụng của tôi trên 3GS iPhone của tôi với iOS 4.2MP3 chơi sử dụng AVAudioPlayer không làm việc trên thiết bị

Tôi đang sử dụng đoạn mã sau đó đóng một âm thanh trong IBAction tôi. Nó hoạt động hoàn hảo trong bộ mô phỏng (cả iPad và iPhone) - tôi nghe thấy âm thanh.

NSString *pathToMusicFile1 = [[NSBundle mainBundle] pathForResource:@"alarm" ofType:@"mp3"]; 
NSError *error; 
alarmSound = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:pathToMusicFile1] error:&error]; 
NSLog(@"Song1 Loaded"); 
if (alarmSound == nil) { 
    NSLog(@"Error playing sound"); 
} else { 
    alarmSound.numberOfLoops = 20; 
    alarmSound.volume = 1.0; 
    [alarmSound play]; 
} 

Tôi có mọi thứ được khai báo đúng cách (tiêu đề và khung công tác vv) khi tôi có thể nghe thấy âm thanh trong trình mô phỏng.

Tôi cũng đã kiểm tra rằng điện thoại của tôi KHÔNG ở chế độ im lặng !! Tôi nghe các âm thanh khác từ giao diện iphone chung. (ví dụ từ một datepicker).

Tôi cũng đã xóa sạch tất cả các mục tiêu và xóa ứng dụng để cài đặt lại.

Bất kỳ ý tưởng gì sai?

Trả lời

1

bạn đã thử [NSURL URLWithString:pathToMusicFile1]; thay vì fileURLWithPath:?

49

Vì vậy, tôi có vấn đề này quá - cũng Tôi khá chắc chắn đó là một trong những giống ...

Chúng tôi đã có một ứng dụng trong cửa hàng ứng dụng trong vòng một năm hoặc lâu hơn bây giờ và thời gian gần đây chúng tôi cần phải thay đổi một chút nội dung mặc dù không có chức năng.

Đột nhiên, âm thanh ngừng hoạt động - Cả trình mô phỏng trong phiên bản sdk mới nhất (phiên bản 4.0) VÀ trên thiết bị quá (một lần nữa chạy iOS 4).

Các mã mà luôn luôn làm việc đối với chúng tôi là này ...

NSString *sound_file; 
if ((sound_file = [[NSBundle mainBundle] pathForResource:@"track1" ofType:@"mp3"])){ 

NSURL *url = [[NSURL alloc] initFileURLWithPath:sound_file]; 
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL]; 
audioPlayer.delegate = self; 
[url release]; 

[audioPlayer prepareToPlay]; 
[audioPlayer play]; 

} 

Cuối cùng, tôi phát hiện ra rằng bây giờ bạn cần phải thiết lập các loại AVAudioSession phát lại chỉ để có được âm thanh để chơi qua loa vì nó đã làm! Đặt sau dòng mã trong xử lý sự kiện đại biểu applicationDidFinishLaunching ứng dụng của bạn ...

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

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

Không quên để thêm bao gồm trong đại biểu ứng dụng của bạn .h file (rõ ràng là bạn cần phải nhập khẩu khuôn khổ AVFoundation quá nếu chưa làm như vậy) ...

#import <AVFoundation/AVAudioSession.h> 

Hy vọng điều này sẽ giúp phát âm thanh của bạn trên thiết bị.

Đừng suy nghĩ kỹ lưỡng bởi những gì tôi nghĩ có thể là một vấn đề riêng biệt và đó là âm thanh vẫn không phát trong trình mô phỏng. Tôi đã nhìn thấy các bài viết khác cho thấy đây là trường hợp, nhưng tôi không chắc chắn làm thế nào phổ biến rộng rãi này. Tôi phát hiện ra rằng nếu tôi chọn iPad 3.2 là mô phỏng của tôi, ít nhất nó cũng đã làm việc trên đó. Niềm vui! Điều gì có vẻ điên rồ với tôi là, chắc chắn điều này phải ảnh hưởng đến vô số người nhưng thật khó để tìm thấy thông tin hoặc gợi ý về một điều gì đó phải là một vấn đề khá nổi tiếng - sau khi tất cả, tôi đã thấy vô số bài đăng trên các diễn đàn dường như không được trả lời.

Anywayz, hy vọng điều này sẽ giúp người khác.

+0

wow this 1 làm việc cho tôi, tôi đã phải đối mặt với cùng một vấn đề, thanx @Jon Andrews! – Dhawal

+4

Mã '[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];' chỉ cần ghi đè công tắc im lặng và cho phép bạn phát âm thanh khi điện thoại bị khóa AFAIK. – evilgoldfish

+0

Cuối cùng! Phải mất một giờ googling, chuyển đổi, nhập khẩu, cố gắng, và điều này cuối cùng đã làm việc. Cảm ơn rất nhiều! – karpathy

17

Vấn đề của tôi là iOS đã tự động phát hành bản sao AVAudioPlayer của tôi trước khi tệp có cơ hội phát. Điều kỳ lạ này chỉ xảy ra với MP3 và không phải tệp AU. Giải pháp là không đặt nó là autorelease và sau đó phát hành nó theo phương thức đại biểu ...

- (void)playSound:(NSString *)sound 
{ 
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:sound ofType:@""]] error:NULL]; 
    audioPlayer.delegate = self; 
    [audioPlayer play]; 
} 

... sau đó trong phương pháp đại biểu ...

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    [player release]; 
} 

... hoạt động tuyệt vời ngay bây giờ.

+19

ARC đã phát hành trình phát trước khi phát. Đặt trình phát là tài sản đã giải quyết vấn đề này cho tôi. – Andy

+1

ARC cũng gây ra điều tương tự cho tôi, và khiến cho nó trở thành một tài sản đã giải quyết nó. Chúc mừng Andy. – AndyDunn

+0

Tôi đã nhìn thấy cùng một vấn đề và điều này có hiệu quả. – Halle

25

Đó là cực kỳ quan trọng để có biến "audioPlayer" làm thuộc tính. Nếu không với ARC, nó sẽ được phát hành trước khi nó có cơ hội để chơi!

Tôi mất nửa giờ và một chút googling cho khoảnh khắc A-ha này.

Âm thanh của tôi hoạt động hoàn hảo ngay bây giờ!

+4

Sau một giờ đầy đặn đầu, tôi cuối cùng đã tìm thấy bài đăng này. Cảm ơn bạn. –

+0

Điều gì về việc chơi trong một chủ đề khác? – AVEbrahimi

+0

tuyệt vời! Bạn đã làm cho ngày của tôi! :) –

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