YouTube API V3上传视频会引发异常

时间:2014-09-10 10:26:08

标签: youtube-api

我正在使用C#的Web应用程序,用户将浏览视频文件,Web应用程序将通过YouTube API V3上传到YouTube。我收到了错误。请告诉我哪里做错了?

错误:System.ArgumentNullException:值不能为null。参数名:baseUri at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)at Microsoft.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)at Microsoft.Runtime .CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult()位于c:\ code \ google.com \ google-api-dotnet-client \ default \ Tools \ Google.Apis中的Google.Apis.Upload.ResumableUpload1.d__e.MoveNext()。 Release \ bin \ Debug \ output \ default \ Src \ GoogleApis \ Apis [Media] \ Upload \ ResumableUpload.cs:line 459

我遵循以下几点。

  1. 为Web应用程序创建了ClientID,并从API Access页面下载了client_secrets.json文件。
  2. 使用https://developers.google.com/youtube/v3/docs/videos/insert#examples中提供的.Net示例代码,也提到https://developers.google.com/youtube/v3/code_samples/dotnet中的相同代码
  3. 我的应用已获得YouTube API授权。
  4. 上传视频文件时,我收到以下错误。
  5. 我粘贴在我的代码下面供你参考。

    / * TestFileUploader.aspx * /

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestFileUploader.aspx.cs" Inherits="TestFileUploader" Async="true" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    </head>
    <body>
        <form id="qaform" runat="server">
            <div>
                <p>
                    <asp:FileUpload runat="server" ID="FileUpload1" onchange="AddEventChoosePicture(this,'FileUpload1')"
                        Style="width: 100%;" />
                </p>
                <p>
                    <asp:Button ID="submit" runat="server" OnClick="submit_Click" Text="Submit" />
                </p>
            </div>
        </form>
    </body>
    </html>
    

    / * TestFileUploader.aspx.cs * /

    using System;
    using System.Web;
    using System.IO;
    using QA.credential;
    
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.YouTube.v3;
    using Google.Apis.Services;
    using Google.Apis.YouTube.v3.Data;
    using Google.Apis.Upload;
    
    public partial class TestFileUploader : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    
        protected void submit_Click(object sender, EventArgs e)
        {
            try
            {
                if (FileUpload1.HasFile)
                {
                    String FileUpload1_Ext = System.IO.Path.GetExtension(this.FileUpload1.PostedFile.FileName);
                    UploadVideos(FileUpload1.FileContent, FileUpload1.PostedFile.ContentType);
                }
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }
    
        }
    
        private async void UploadVideos(Stream uploadedStream, String contenttype)
        {
            try
            {
                UserCredential credential;
                String clientsecretkeypath = HttpContext.Current.Server.MapPath("~/client_secrets.json");
                using (var stream = new FileStream(clientsecretkeypath, FileMode.Open, FileAccess.Read))
                {
                    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                        GoogleClientSecrets.Load(stream).Secrets,
                        new[] { YouTubeService.Scope.YoutubeUpload },
                        "user", System.Threading.CancellationToken.None);
                }
    
                // Create the service.
                var youtubeService = new YouTubeService(new BaseClientService.Initializer()
                {
                    //ApiKey = "AIzaSyAFxuAA4r4pf6VX75zEwCrIh5z4QkzOZ6M",
                    HttpClientInitializer = credential,
                    ApplicationName = PhotoandVideoupload.applicationname
                });
    
                var video = new Video();
                video.Snippet = new VideoSnippet();
                video.Snippet.Title = "My Test Movie";
                video.Snippet.Description = "My description";
                video.Snippet.Tags = new string[] { "Autos" };
                video.Snippet.CategoryId = "2";
                video.Status = new VideoStatus();
                video.Status.PrivacyStatus = "unlisted";
    
                // Using snippet,status below throws 401(UnAuthorized issue).
                // Using snippet alone throws 404(Bad Request).
                //In both case, Null Exception throws for parameter baseURI.
                var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet", uploadedStream, contenttype);
                videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
                videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;
    
                Google.Apis.Upload.IUploadProgress progress = await videosInsertRequest.UploadAsync();
    
                switch (progress.Status)
                {
                    case UploadStatus.Uploading:
                        Response.Write(String.Format("{0} bytes sent.", progress.BytesSent));
                        break;
    
                    case UploadStatus.Failed:
                        Response.Write(String.Format("{0}<br/>", progress.Exception.Message));
                        Response.Write(String.Format("{0}<br/>", progress.Exception.StackTrace));
                        break;
                }
    
    
                // Also tried to read file from server path instead of uploading via fileupload control.
                /*
                using (var fileStream = new FileStream(HttpContext.Current.Server.MapPath("~/1.mp4"), FileMode.Open))
                {
                    var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, contenttype);
                    videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
                    videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;
    
                    await videosInsertRequest.UploadAsync();
                }
                */
    
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message + " " + ex.StackTrace);
            }
            finally
            {
            }
        }
    
        void videosInsertRequest_ProgressChanged(Google.Apis.Upload.IUploadProgress progress)
        {
            switch (progress.Status)
            {
                case UploadStatus.Uploading:
                    Response.Write(String.Format("{0} bytes sent.", progress.BytesSent));
                    break;
    
                case UploadStatus.Failed:
                    Response.Write(String.Format("{0}<br/>", progress.Exception.Message));
                    Response.Write(String.Format("{0}<br/>", progress.Exception.StackTrace));
                    break;
            }
        }
    
        void videosInsertRequest_ResponseReceived(Video video)
        {
            Response.Write(String.Format("Video id '{0}' was successfully uploaded.", video.Id));
        }
    
    }
    

    请告知我哪里做错了?

    谢谢,

1 个答案:

答案 0 :(得分:0)

您可以尝试以下更改:

自:

var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet", uploadedStream, contenttype);

要:

var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", uploadedStream, contenttype);

另外,contenttype是什么?我使用 video / * 作为视频上传的内容类型。

状态代码401错误可能是因为YouTube API尚未获得授权。检查您是否已授权使用YouTube API获取凭据。转到Google Developers Console,然后单击您的项目名称。然后点击&#34; API&#34;在左侧导航菜单中。检查 YouTube Data API v3 是否已开启。