2010-06-08 17 views
5

Używam .NET do tworzenia aplikacji do przesyłania wideo. Chociaż jest to komunikacja z YouTube i przesyłanie pliku, przetwarzanie tego pliku kończy się niepowodzeniem. YouTube wyświetla mi komunikat o błędzie: "Przesyłanie nie powiodło się (nie można przekonwertować pliku wideo)." To oznacza, że ​​rzekomo „Twój film jest w formacie, który nasze konwertery nie rozpoznać ...”youtube - błąd przesyłania wideo - nie można przekonwertować pliku - kodowanie wideo jest nieprawidłowe?

Zrobiłem próby z dwóch różnych filmów, z których oba przesyłać i przetwarzania grzywny, kiedy to zrobić ręcznie . Podejrzewam, że mój kod to a.) Nie kodowanie wideo prawidłowo i/lub b.) Nie wysyłanie poprawnie żądania API .

Poniżej jest jak ja konstruowania moją prośbę API PUT i kodowania wideo :

Wszelkie sugestie na temat tego, co może być błąd byłyby mile widziane.

Dzięki

P.S. Nie używam biblioteki klienta, ponieważ moja aplikacja będzie korzystać z funkcji wznawiania przesyłania. W związku z tym ręcznie buduję żądania API .

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

Kod:

  // 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

Proszę nie powtarzać w tytule tagów takich jak ".NET". Pozostaw je w tagach, do których należą. –

Odpowiedz

0

nie wiem jakim formacie YouTube szuka, ale jeśli jest to format, który powinien być rozpoznawalny w systemie Windows Proponuję zapisać przekształcony plik wideo na plik na dysku, a następnie spróbuj go otworzyć.

0

Żądanie wysyłania odbywa się w 2 częściach ... Wysyłamy nagłówek wraz z rozmiarem wideo, tak jak Ty ... YouTube odpowiada za pomocą adresu URL, a Ty wysyłasz wideo do tego adresu URL. Wygląda próbujesz wysłać wszystko w jednym żądaniu. Coś trochę takiego.

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