presentMediaPlayerControllerWithURL无法使用google tts API

时间:2015-10-08 13:10:39

标签: ios text-to-speech watchkit apple-watch watch-os-2

我正在使用WatchKit为Apple手表开发应用。我正在尝试播放使用Google的文字转语音API收到的音频文件。以下是我正在使用的代码:

NSURL *myUrl =[NSURL URLWithString:@"https://translate.google.com/translate_tts?key={my_private_key}&ie=UTF-8&tlen&q=Hello%20testing&client=t"];
[self presentMediaPlayerControllerWithURL:myUrl options:nil
                                   completion:^(BOOL didPlayToEnd, NSTimeInterval endTime, NSError * __nullable error) {
                                       if (error){
                                           NSLog(@"%@",error.description);
                                       }
                                   }];

但代码返回以下错误:

Error Domain=com.apple.watchkit.errors Code=4 "Cannot Open" UserInfo={NSLocalizedFailureReason=This media format is not supported., NSUnderlyingError=0x15d506f0 {Error Domain=NSOSStatusErrorDomain Code=-12847 "(null)"}, NSLocalizedDescription=Cannot Open}

API正在返回一个应该在Apple Watch OS2中支持的mp3文件。为什么我收到此错误?我该如何解决?我确信音频可以播放,因为我在商店里看到一些使用谷歌TTS并使用WatchKit播放声音的应用程序。

1 个答案:

答案 0 :(得分:1)

来自WatchOS 2 Documentation:

  

将您从网络下载的媒体文件(或从iOS应用程序传输)放在共享组容器中。共享组容器为您的Watch应用和WatchKit扩展提供通用存储。在扩展代码中,为容器内的任何媒体文件创建URL,并使用它们配置媒体接口。

您需要在功能中启用应用组并设置共享组容器。然后使用容器URL放置下载的语音音频并使用 presentMediaPlayerControllerWithURL

进行播放

示例:

NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.xxxxx.xxx"];

                                      containerURL = [containerURL URLByAppendingPathComponent:[NSString stringWithFormat:@"Caches/tts.mp3"]];

                                      [data writeToURL:containerURL atomically:YES];
                                      //data you received from Google TTS response

[self presentMediaPlayerControllerWithURL:containerURL
                                  options:nil
                               completion:^(BOOL didPlayToEnd, NSTimeInterval endTime, NSError * __nullable error) {
                                   if (error){                                           
                                       //error handling                                           
                                   }
                               }];