Google Drive SDK - 流音频文件

时间:2013-08-09 17:05:38

标签: iphone ios ipad stream google-drive-api

有没有办法通过AVPlayer从Google云端硬盘流式播放音频文件?

我尝试过使用file.downloadUrl和file.webContentLink,但它无法正常工作。

代码:

GTLDriveFile *file = [self.data objectAtIndex:indexPath.row];
if (player)
{
    [player removeObserver:self forKeyPath:@"status"];
    [player pause];
}

player = [AVPlayer playerWithURL:[NSURL URLWithString:file.downloadUrl]];
//or
//player = [AVPlayer playerWithURL:[NSURL URLWithString:file.webContentLink]];
[player addObserver:self forKeyPath:@"status" options:0 context:nil];

if (delegate && [delegate respondsToSelector:@selector(audioPlayerDidStartBuffering)])
[delegate audioPlayerDidStartBuffering];

如果无法流式传输,是否可以在/ tmp文件夹中开始下载并在下载时播放?

2 个答案:

答案 0 :(得分:2)

我可以通过将access_token附加到下载URL

来解决它
audiofile.strPath=[NSString stringWithFormat@"%@&access_token=%@",downloadUrl,accessToken];   

将strPath传递给您的AvPlayer对象。

您可以从GTMOAuth2Authentication对象

获取访问令牌

请注意,如果过期,您可能需要刷新它。

希望这会对你有所帮助。

此致 Nitesh

答案 1 :(得分:1)

这只是因为您没有从下载请求的标头提供客户端的访问代码。当您获得downloadUrl时,该链接不是公共链接,您应该提供与所有其他Drive API请求相同的授权。

例如,用于从downloadUrl下载内容的Object-c代码如下所示:

+ (void)downloadFileContentWithService:(GTLServiceDrive *)service
                                  file:(GTLDriveFile *)file
                       completionBlock:(void (^)(NSData *, NSError *))completionBlock {
  if (file.downloadUrl != nil) {
    // More information about GTMHTTPFetcher can be found on
    // http://code.google.com/p/gtm-http-fetcher
    GTMHTTPFetcher *fetcher =
      [service.fetcherService fetcherWithURLString:file.downloadUrl];

    [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
      if (error == nil) {
        // Success.
        completionBlock(data, nil);
      } else {
        NSLog(@"An error occurred: %@", error);
        completionBlock(nil, error);
      }
    }];
  } else {
    completionBlock(nil,
                    [NSError errorWithDomain:NSURLErrorDomain
                                        code:NSURLErrorBadUrl
                                    userInfo:nil]);
  }
}

或者,如果您可以将其他参数传递给AVPlayer,以便在下载文件时发送额外的标题进行授权,请添加以下标题:

Authorization: Bearer {YOUR_ACCESS_TOKEN}