在 iPhone/iPad 应用程序中播放音频文件?

Posted

技术标签:

【中文标题】在 iPhone/iPad 应用程序中播放音频文件?【英文标题】:Play audio files in iPhone/iPad application? 【发布时间】:2011-04-16 13:28:15 【问题描述】:

我想在我的应用程序中播放声音,因为我使用的是 .mp3 文件类型。它在模拟器中运行良好,但是当我在我的设备上吃午饭时,它不工作并且不产生任何声音,任何人都可以帮助我为什么它不能在设备上工作,或者哪种文件格式更适合在 iPhone 和 iPad 中播放音频文件?

NSURL *tapSound   = [[NSBundle mainBundle] URLForResource: [NSString stringWithFormat:@"%@",SoundFileName] withExtension: @""];

// Store the URL as a CFURLRef instance
 self.soundFileURLRef = (CFURLRef) [tapSound retain];

 // Create a system sound object representing the sound file.
 AudioservicesCreateSystemSoundID (
                     soundFileURLRef,
                    &soundFileObject
                    );

AudioServicesPlaySystemSound (soundFileObject);

以上是我播放声音的代码

谢谢。

【问题讨论】:

@user532445,或者如果没有人发布可接受的答案,请发布您自己的问题的答案,以便您继续开发。这样你就可以回馈 SO。 【参考方案1】:

如果设备静音,系统声音 ID 将无法播放,因此这可能是原因。 (根据official documentation,它们仅用于用户界面效果,例如警报等。)

因此,我很想使用AVAudioPlayer 风格的方法。作为示例(没有双关语)实现:

// *** In your interface... ***
#import <AVFoundation/AVFoundation.h>

...

AVAudioPlayer *testAudioPlayer;

// *** Implementation... ***

// Load the audio data
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"sample_name" ofType:@"wav"];
NSData *sampleData = [[NSData alloc] initWithContentsOfFile:soundFilePath];
NSError *audioError = nil;

// Set up the audio player
testAudioPlayer = [[AVAudioPlayer alloc] initWithData:sampleData error:&audioError];
[sampleData release];

if(audioError != nil) 
    NSLog(@"An audio error occurred: \"%@\"", audioError);

else 
    [testAudioPlayer setNumberOfLoops: -1];
    [testAudioPlayer play];




// *** In your dealloc... ***
[testAudioPlayer release];

您还应该记住设置适当的音频类别。 (见AVAudioSessionsetCategory:error:方法。)

最后,您需要将 AVFoundation 库添加到您的项目中。为此,请在 Xcode 的 Groups & Files 列中单击项目的目标,然后选择“Get Info”。然后选择 General 选项卡,单击底部“Linked Libraries”窗格中的 + 并选择“AVFoundation.framework”。

【讨论】:

【参考方案2】:

老实说,我建议使用 AVAudioPlayer 代替这个,但您可以尝试使用这个替代代码。在您的示例中,您似乎忘记包含扩展名,这也可能是问题所在。模拟器在命名方面更为宽松,因此如果您忘记了扩展名,它可能会在模拟器上播放,而不是在设备上播放。

SystemSoundID   soundFileObject;
CFURLRef soundFileURLRef = CFBundleCopyResourceURL (CFBundleGetMainBundle (),CFSTR ("sound"),CFSTR ("mp3"),NULL );
AudioServicesCreateSystemSoundID (soundFileURLRef,&soundFileObject );
AudioServicesPlaySystemSound (soundFileObject);

【讨论】:

以上是关于在 iPhone/iPad 应用程序中播放音频文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 iPhone / iPad 的状态栏中显示播放图标

应用程序进入后台时播放音频

在 iphone/ipad 扬声器中录制音频

iOS - 从后台程序访问输出音频

如何检测其他应用程序是不是正在播放背景音频?

如何在 iphone/ipad 停靠栏中显示播放项目的详细信息?