0

我正在为语音消息集成第三方 SDK。它将音频文件保存到 Documents/audio/。我使用 iFunBox 查看了我的测试设备上的包,发现文件的名称如下:“b3abwx78...wav”。没有文件扩展名,名称的结尾只是“wav”,而不是“.wav”,这可能会导致我的问题。我使用的 SDK 是专有的,无法控制文件的保存方式。

该文件被 SDK 引用为“elem.text”,其日志如下所示:“audio://a8c0cd0c4138d66cc32cbdfb3c213f3bwav”

所以,我想做的只是将该文件加载到 AVAudioPlayer 并播放它。这是我目前正在尝试的。“路径”记录为空,URL也是如此,所以很明显我做错了什么:

-(void)playVoiceMail:(NSString *)filename
{
NSError *error;
NSString *escapedFilename = [filename stringByReplacingCharactersInRange:NSMakeRange(0, 8) withString:@""];
NSLog(@"escaped filename: %@", escapedFilename);

NSString *path = [[NSBundle mainBundle] pathForResource:escapedFilename
                                                 ofType:nil
                                            inDirectory:@"Documents/audio"];

NSLog(@"path: %@", path);

NSURL *URL = [NSURL URLWithString:path];

NSLog(@"URL: %@", URL);


AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:URL
                                                               error: &error];

NSLog(@"Player url: %@", player.url);

if (error)
    NSLog(@"ERROR: %@", error.localizedDescription);

if (!player.playing)
    if (![player play])
        NSLog(@"ERROR playing");
}
4

1 回答 1

2

你在储存音频文件吗?如果它们存储在您的应用程序包中,请尝试如下代码:

...
NSString *path = [[NSBundle mainBundle] pathForResource:escapedFilename
                                                 ofType:nil];
...

如果它们存储在 Documents 文件夹中,您应该像这样访问它们:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"filename"];
NSURL *url ....

编辑:如果您的 url 不为空,那么问题是使用 ARC,在 playVoiceMail 方法结束后释放 AudioPalyer 实例。您应该像这样创建一个强大的属性:

@property (nonatomic, strong) AVAudioPlayer *player;

...
self.player= [[AVAudioPlayer alloc] initWithContentsOfURL:URL
                                                               error: &error];

[self.player play];
...
于 2013-10-20T18:24:22.280 回答