如何通过HTTP请求将视频上传到YouTube?

时间:2019-11-28 02:24:38

标签: http youtube-api youtube-data-api

我已经尝试了好几个小时了。咨询official documentation,它说我需要向https://www.googleapis.com/upload/youtube/v3/videos发出发布请求,并将内容类型标头设置为video/*application/octet-stream(我已经使用了后者)。原来,如果我只是将视频文件的缓冲区发布到该URL,它将起作用。但是文档还说我可以指定有关视频的一整套选项(标题,描述,标签等)。但是,它表示要将这些信息附加到请求正文中!我对如何在同一请求中发送视频字节和选项感到困惑。也许不应该是相同的请求,但是他们没有提及使用多次。

2 个答案:

答案 0 :(得分:1)

使用Youtube API上传视频是通过Google称为“可恢复上传协议”的协议完成的。 Google在其API(例如Drive,Youtube等)中使用了该协议,建议在以下情况下使用

  • 上传大文件
  • 网络连接不可靠。

有关如何在Youtube API中使用“可恢复上传协议”的完整详细信息,请访问https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol

以下是一组简化的步骤:

  1. 通过向POST API端点发送insert请求来创建可恢复的上传会话。
  2. 从上述请求的Location标头中读取可恢复会话URI。
  3. 通过将包含二进制视频数据的PUT请求正文发送到可恢复的会话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提供的库来完成此操作。

我希望这会有所帮助。