GAE“当调用上传视频文件时,API调用urlfetch.Fetch()需要比可用的更多配额”

时间:2013-06-14 12:21:52

标签: google-app-engine youtube-api urlfetch

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

我还尝试使用“直接上传”上传60M大小的视频文件,然后错误消息为“java.lang.OutOfMemory:com.google.protobuf.ByteString中的Java堆空间”。 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应用程序只能在某段时间内发送一定数量的请求。由于“可恢复上传”将文件流分解为块,并以一系列请求发送它们,因此它很容易达到限制。如果我的猜测是正确的,那么限制是什么?我该如何解决这个问题?如果我猜错了,你认为问题出在哪里?

由于

1 个答案:

答案 0 :(得分:2)

谢谢你们!

这是传入和放大的限制GAE中URL提取的传出带宽: https://developers.google.com/appengine/docs/quotas

默认情况下,限制为22M / min,启用账单后,限制为740M / min。所以在22M / min的限制下,GAE任务队列可以将大约220M的视频文件上传到Youtube(22M * 10min)

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

Video returnedVideo = videoInsert.execute();

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