2012-12-13 8 views
6

YouTube APIを使用して直接アップロードで大きな動画をアップロードしようとするたびに。私はOutOfMemory Exceptionを取得します。これを取り除くために私ができることはありますか? YouTube APIでは、ダイレクトアップロードによる動画サイズ制限については何も言及していません。YouTube直接アップロード - OutOfMemory例外

私はダイレクトアップロードをあきらめました。今、私は再開可能なアップロード方法を試しています。私のコードは以下の通りです。

YouTubeRequest request; 
YouTubeRequestSettings settings = new YouTubeRequestSettings("YouTube Upload", Client Key, "Username", "Password"); 
request = new YouTubeRequest(settings); 
Video newVideo = new Video(); 

ResumableUploader m_ResumableUploader = null; 
Authenticator YouTubeAuthenticator; 

m_ResumableUploader = new ResumableUploader(256); //chunksize 256 kilobyte 
m_ResumableUploader.AsyncOperationCompleted += new AsyncOperationCompletedEventHandler(m_ResumableUploader_AsyncOperationCompleted); 
m_ResumableUploader.AsyncOperationProgress += new AsyncOperationProgressEventHandler(m_ResumableUploader_AsyncOperationProgress); 

YouTubeAuthenticator = new ClientLoginAuthenticator("YouTubeUploader", ServiceNames.YouTube, "[email protected]", "password"); 

//AtomLink link = new AtomLink("http://uploads.gdata.youtube.com/resumable/feeds/api/users/uploads"); 
//link.Rel = ResumableUploader.CreateMediaRelation; 
//newVideo.YouTubeEntry.Links.Add(link); 

System.IO.FileStream stream = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); 

byte[] chunk = new byte[256000];int count = 1; 
while (true) { 
    int index = 0; 
    while (index < chunk.Length) { 
     int bytesRead = stream.Read(chunk, index, chunk.Length - index); 
     if (bytesRead == 0) { 
      break; 
     } 
     index += bytesRead; 
    } 
    if (index != 0) { // Our previous chunk may have been the last one 
     newVideo.MediaSource = new MediaFileSource(new MemoryStream(chunk), filePath, "video/quicktime"); 
     if (count == 1) { 
      m_ResumableUploader.InsertAsync(YouTubeAuthenticator, newVideo.YouTubeEntry, new MemoryStream(chunk)); 
      count++; 
     } 
     else 
      m_ResumableUploader.ResumeAsync(YouTubeAuthenticator, new Uri("http://uploads.gdata.youtube.com/resumable/feeds/api/users/uploads"), "POST", new MemoryStream(chunk), "video/quicktime", new object()); 
    } 
    if (index != chunk.Length) { // We didn't read a full chunk: we're done 
     break; 
    } 
} 

誰が間違っているのか教えていただけますか?私の2 GBビデオはアップロードされません。

+1

あなたのコードは何ですか?何を試しましたか?あなたのエラーコードは何ですか? –

+0

例外はどこに投げられますか?多分stacktraceを提供してください –

+0

行:m_ResumableUploader.InsertAsync(...)エラー:System.Net.WebException:リモートサーバーがエラーを返しました:(403)禁止されています。 System.Net.HttpWebRequest.GetResponse()の –

答えて

5

私は403禁止エラーになった理由は、によるものでした私は渡していなかったという事実:

  1. ユーザー名&パスワード
  2. キー開発者

上記のコードのリクエスト変数は、アップロードで使用/送信されていません。したがって、私は不正なアップロードを行っていました。

4

あなたのオブジェクトを処分していない可能性があります。例えば

...すべての使い捨てのオブジェクトを使用して文の範囲内にあることを確認し、このコードは、サーバーに大きなzipファイルをアップロードします:

try 
{ 
    using (Stream ftpStream = FTPRequest.GetRequestStream()) 
    { 
     using (FileStream file = File.OpenRead(ImagesZipFile)) 
     { 
      // set up variables we'll use to read the file 
      int length = 1024; 
      byte[] buffer = new byte[length]; 
      int bytesRead = 0; 

      // write the file to the request stream 
      do 
      { 
       bytesRead = file.Read(buffer, 0, length); 
       ftpStream.Write(buffer, 0, bytesRead); 
      } 
      while (bytesRead != 0); 
     } 
    } 
} 
catch (Exception e) 
{ 
    // throw the exception 
    throw e; 
} 
関連する問題