我已经尝试了好几个小时了。咨询official documentation,它说我需要向https://www.googleapis.com/upload/youtube/v3/videos
发出发布请求,并将内容类型标头设置为video/*
或application/octet-stream
(我已经使用了后者)。原来,如果我只是将视频文件的缓冲区发布到该URL,它将起作用。但是文档还说我可以指定有关视频的一整套选项(标题,描述,标签等)。但是,它表示要将这些信息附加到请求正文中!我对如何在同一请求中发送视频字节和选项感到困惑。也许不应该是相同的请求,但是他们没有提及使用多次。
答案 0 :(得分:1)
使用Youtube API上传视频是通过Google称为“可恢复上传协议”的协议完成的。 Google在其API(例如Drive,Youtube等)中使用了该协议,建议在以下情况下使用
有关如何在Youtube API中使用“可恢复上传协议”的完整详细信息,请访问https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol。
以下是一组简化的步骤:
POST
API端点发送insert
请求来创建可恢复的上传会话。Location
标头中读取可恢复会话URI。答案 1 :(得分:-1)
您实际上可以使用与您用来编写API的语言相关的sdk或某些youtube库。在文档中,不清楚要为同时传递两者指定什么内容。
var youtubeService = new YouTubeService(new BaseClientService.Initializer() {
HttpClientInitializer = credential,
ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
});
var video = new Video();
video.Snippet = new VideoSnippet();
video.Snippet.Title = "Default Video Title";
video.Snippet.Description = "Default Video Description";
video.Snippet.Tags = new string[] { "tag1", "tag2" };
video.Snippet.CategoryId = "22"; // See https://developers.google.com/youtube/v3/docs/videoCategories/list
video.Status = new VideoStatus();
video.Status.PrivacyStatus = "unlisted"; // or "private" or "public"
var filePath = @"REPLACE_ME.mp4"; // Replace with path to actual movie file.
using (var fileStream = new FileStream(filePath, FileMode.Open))
{
var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, "video/*");
videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;
await videosInsertRequest.UploadAsync();
}
}
在这里,我们在同一函数中同时传递了文件流和元数据。您也可以使用google提供的库来完成此操作。
我希望这会有所帮助。