我有一个可以在浏览器中播放的wav文件:
但是,它不能在我的模拟器上播放。 在iOS中支持wav文件是否有一些限制?
NSString *urlString = @"https://d5e5ca34-f670-4a7f-98c7-1643d83ecc1d:N8UAQQPXw10Z@stream.watsonplatform.net/text-to-speech/api/v1/synthesize?accept=audio/wav&voice=en-US_MichaelVoice&text=Hello%20world";
NSURL *url = [NSURL URLWithString:urlString];
NSData *audioData=[NSData dataWithContentsOfURL:url];
NSError *error;
self.player = [[AVAudioPlayer alloc] initWithData:audioData error:&error];
[self.player setVolume:1.0];
[self.player setDelegate:self];
[self.player setNumberOfLoops:0];
[self.player prepareToPlay];
[self.player play];
答案 0 :(得分:1)
您的wav音频文件有问题。它与Apple编解码器不兼容。我尝试了一个不同的在线wav文件,它工作正常。这是我的工作代码。 确保在info.plist文件中添加“应用传输安全设置”
在* .h
#import <UIKit/UIKit.h>
#include <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVAudioPlayer.h>
@interface v1MyCustomAudioPlay : UIViewController <AVAudioPlayerDelegate>
@property (nonatomic, retain) AVAudioPlayer *myAudioPlayer1;
在* .m
@implementation v1MyCustomAudioPlay
@synthesize myAudioPlayer1;
-(IBAction)playAudio
{
NSLog(@"playAudio ...");
NSString *urlString = @"http://www-mmsp.ece.mcgill.ca/documents/audioformats/wave/Samples/AFsp/M1F1-Alaw-AFsp.wav";
NSURL *fileURL = [NSURL URLWithString:urlString];
NSData *soundData = [NSData dataWithContentsOfURL:fileURL];
myAudioPlayer1 = [[AVAudioPlayer alloc] initWithData:soundData error:NULL];
myAudioPlayer1.delegate = self;
[myAudioPlayer1 play];
}
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
[myAudioPlayer1 stop];
NSLog(@"Finished Playing");
}
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error
{
NSLog(@"Error occurred");
}
答案 1 :(得分:0)
支持WAV。请在类似的问题中阅读答案: Supported Audio file formats in iPhone
关于你的代码,我不会使用NSData方法加载文件,而是使用更清晰的内容,如下面的答案所示:https://stackoverflow.com/a/14424418/883738
重点是
不建议使用dataWithContentsOfURL:因为它是同步的 并将阻止您的应用程序工作;如果服务器没有响应 它可以阻止你的应用很长一段时间。
希望这有帮助。
更新:在示例iOS项目中执行代码没有声音,所以问题仍未解决。
顺便说一句,如果你想使用语音合成器,你可以使用iOS内置的NSString *string = @"Hello, World!";
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:string];
utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"];
AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
[synthesizer speakUtterance:utterance];