0

我的 GAE 应用程序通过 Drive API 将 Drive 中的文件读取到 FileStream 中,然后通过 Youtube API v3 将 FileStream 上传到 Youtube,并带有“可恢复上传”。当文件大小变大(例如 60M )时,Youtube API 返回此错误“ API 调用 urlfetch.Fetch() 需要的配额比可用的多

我也尝试使用“直接上传”来上传 60M 大小的视频文件,然后错误消息将是“java.lang.OutOfMemory: Java heap space at com.google.protobuf.ByteString.copyFrom (ByteString.java:178)”。

这是我的代码的简短版本:

GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(HTTP_TRANSPORT)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
            .setServiceAccountScopes(YouTubeScopes.YOUTUBE)
            .setServiceAccountPrivateKeyFromP12File(new File(P12))
            .setServiceAccountUser(account).build();
YouTube service = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName("VSP").build();
Video videoObjectDefiningMetadata = new Video();
VideoSnippet snippet = new VideoSnippet();
snippet.setTitle(title);
videoObjectDefiningMetadata.setSnippet(snippet);
InputStreamContent mediaContent = new InputStreamContent(VIDEO_FILE_FORMAT, new BufferedInputStream(filestream));
mediaContent.setLength(filesize);
YouTube.Videos.Insert videoInsert = service.videos().insert("snippet,statistics,status", videoObjectDefiningMetadata, mediaContent);

MediaHttpUploader uploader = videoInsert.getMediaHttpUploader();
uploader.setDirectUploadEnabled(false);
uploader.setChunkSize(7864320);

Video returnedVideo = videoInsert.execute();

错误消息“API 调用 urlfetch.Fetch() 需要的配额超过可用配额”出现在代码的最后一行。有时通过设置不同的ChunkSize可以成功完成上传并显示错误消息,有时则不会。

我找不到有关此错误消息的任何有用信息。但我的猜测是,GAE 应用程序只能在一定时间内发送一定数量的请求。由于“可恢复上传”将文件流分成块,并按一系列请求发送它们,因此很容易达到限制。如果我的猜测是正确的,那么限制是多少?我该如何解决这个问题?如果我的猜测是错误的,您认为问题出在哪里?

谢谢

4

1 回答 1

3

多谢你们!

以下是 GAE 中 URL Fetch 的传入和传出带宽限制: https ://developers.google.com/appengine/docs/quotas

默认限制为 22M/min,开启计费后限制变为 740M/min。所以在 22M/min 的限制下,一个 GAE 任务队列可以上传大约 220M 的视频文件到 Youtube (22M * 10min)

但这导致了使用上层代码的问题

Video returnedVideo = videoInsert.execute();

,因为我们无法控制该代码中每分钟发送多少块。我所做的解决方案是按照以下链接中的描述自行处理每个请求。https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol 通过这种方式,我们可以控制每分钟可以发送的流的大小。

于 2013-06-18T13:24:36.413 回答