有没有办法通过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文件夹中开始下载并在下载时播放?
答案 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}