2010-06-08 14 views
5

J'utilise .NET pour créer une application de téléchargement de vidéo. Bien que ce soit en communication avec YouTube et en téléchargeant le fichier, le traitement du fichier échoue. YouTube me donne le message d'erreur, "Téléchargement a échoué (impossible de convertir le fichier vidéo)." Cela signifie que soi-disant « votre vidéo est dans un format que nos convertisseurs ne reconnaissent pas ... »youtube - échec de téléchargement de vidéo - impossible de convertir le fichier - l'encodage de la vidéo n'est pas correct?

J'ai fait des tentatives avec deux vidéos différentes, toutes deux téléversent et bien processus quand je le fais manuellement . Donc, je soupçonne que mon code est a.) Ne pas encoder la vidéo correctement et/ou b.) Ne pas envoyer ma demande API correctement.

Ci-dessous est la façon dont je construis ma demande API PUT et codant pour la vidéo:

Toutes les suggestions sur ce que l'erreur pourrait être serait apprécié.

Merci

P.S. Je n'utilise pas la bibliothèque client car mon application utilisera la fonctionnalité de téléchargement de reprise. Ainsi, je construis manuellement mes demandes d'API .

Documentation: http://code.google.com/intl/ja/apis/youtube/2.0/developers_guide_protocol_resumable_uploads.html#Uploading_the_Video_File

code:

  // new PUT request for sending video 
      WebRequest putRequest = WebRequest.Create(uploadURL); 

      // set properties 
      putRequest.Method = "PUT"; 
      putRequest.ContentType = getMIME(file); //the MIME type of the uploaded video file 

      //encode video 
      byte[] videoInBytes = encodeVideo(file); 

    public static byte[] encodeVideo(string video) 
    { 
     try 
     { 
      byte[] fileInBytes = File.ReadAllBytes(video); 
      Console.WriteLine("\nSize of byte array containing " + video + ": " + fileInBytes.Length); 
      return fileInBytes; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("\nException: " + e.Message + "\nReturning an empty byte array"); 
      byte [] empty = new byte[0]; 
      return empty; 
     } 
    }//encodeVideo 

      //encode custom headers in a byte array 
      byte[] PUTbytes = encode(putRequest.Headers.ToString()); 

      public static byte[] encode(string headers) 
      {    
       ASCIIEncoding encoding = new ASCIIEncoding(); 
       byte[] bytes = encoding.GetBytes(headers); 
       return bytes; 
      }//encode 

      //entire request contains headers + binary video data 
      putRequest.ContentLength = PUTbytes.Length + videoInBytes.Length; 

      //send request - correct? 
      sendRequest(putRequest, PUTbytes); 
      sendRequest(putRequest, videoInBytes); 

    public static void sendRequest(WebRequest request, byte[] encoding) 
    { 
     Stream stream = request.GetRequestStream(); // The GetRequestStream method returns a stream to use to send data for the HttpWebRequest. 

     try 
     { 
      stream.Write(encoding, 0, encoding.Length); 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine("\nException writing stream: " + e.Message); 
     } 
    }//sendRequest 
+0

Veuillez ne pas répéter les balises comme ".NET" dans le titre. Laissez-les dans les tags où ils appartiennent. –

Répondre

0

Je ne sais pas quel format YouTube est à la recherche, mais si elle est un format qui devrait être reconnaissable sur votre système Windows, je vous suggère d'enregistrer votre vidéo convertie en un fichier sur le disque, puis essayez de l'ouvrir.

0

La demande d'envoi est faite en 2 parties ... Vous envoyez l'en-tête, y compris la taille de la vidéo que vous avez ... YouTube répond avec une URL, et vous envoyez la vidéo à cette URL .. Ressemble vous essayez d'envoyer tout en une seule demande. Quelque chose un peu comme ça.

Try 
     Try 
      _request = CType(WebRequest.Create(_requestUrl), HttpWebRequest) 

      With _request 
       .ContentType = "application/atom+xml; charset=UTF-8" 
       .ContentLength = _postBytes.Length 
       .Method = "POST" 
       .Headers.Add("Authorization", String.Format("GoogleLogin auth={0}", MasterAccessToken.ClientLoginToken)) 
       .Headers.Add("GData-Version", "2") 
       .Headers.Add("X-GData-Key", String.Format("key={0}", YouTube.Constants.Security.DEVELOPERKEY)) 
       .Headers.Add("Slug", filename) 
      End With 

      _writeStream = _request.GetRequestStream 
      With _writeStream 
       .Write(_postBytes, 0, _postBytes.Length) 
      End With 

      Using _response = CType(_request.GetResponse, HttpWebResponse) 
       With _response 
        If .StatusCode = HttpStatusCode.OK OrElse .StatusCode = HttpStatusCode.Created Then 
         _ans = _response.Headers("Location") 
        Else 
         Throw New WebException("Cannot get ClientLogin upload location", Nothing, WebExceptionStatus.ProtocolError, _response) 
        End If 
       End With 
      End Using 

     Catch ex As Exception 

     Finally 
      If _writeStream IsNot Nothing Then 
       _writeStream.Close() 
      End If 

     End Try 

     _videoUploadLocation = _ans 

     'Got the upload location..... now get the file 
     Dim _file As FileInfo = New FileInfo(filename) 
     Dim _fileLength As Integer 

     Using _fileStream As System.IO.FileStream = _file.OpenRead 
      _fileLength = CType(_fileStream.Length, Integer) 

      If _fileLength = 0 Then 
       Throw New FileLoadException("File appears to be of zero length in UploadVideoFromFileClientLogin:", filename) 
      End If 

      'create the webrequest 
      _request = CType(WebRequest.Create(_videoUploadLocation), HttpWebRequest) 

      'No authentication headers needed.. 
      With _request 
       .Timeout = 6000000  'Timeout for this request changed to 10 minutes 
       .ReadWriteTimeout = 6000000 
       .KeepAlive = True 
       .ContentType = "application/octet-stream" 
       .ContentLength = _fileLength 
       .Method = "POST" 
      End With 

      'and get the stream 
      _writeStream = _request.GetRequestStream 

      'And send it over the net 
      m_StreamUtils.CancelRequest = False 
      m_StreamUtils.SendStreamToStream(_fileStream, _writeStream, AddressOf UploadPogressChanged) 
      m_CancelRequest = m_StreamUtils.CancelRequest 
     End Using 

     If Not (m_CancelRequest) Then 

      Using _response = CType(_request.GetResponse, HttpWebResponse) 
       With _response 
        If .StatusCode = HttpStatusCode.Created Then 
         _ans = _response.ResponseUri.AbsoluteUri 
        Else 
         Throw New WebException("Cannot get ClientLogin upload location", Nothing, WebExceptionStatus.ProtocolError, _response) 
        End If 
       End With 
      End Using 
     Else 
      _ans = String.Empty 

     End If 

     If _writeStream IsNot Nothing Then 
      _writeStream.Close() 
     End If