youtube - ошибка загрузки видео - не удается преобразовать файл - кодировка видео неверна? - PullRequest
5 голосов
/ 08 июня 2010

Я использую .NET для создания приложения для загрузки видео. Хотя это общение с YouTube и загрузка файла, обработка этот файл не удается. YouTube выдает мне сообщение об ошибке «Ошибка загрузки (невозможно конвертировать видеофайл). «Это предположительно означает, что» ваш видео в формате, который наши конвертеры не распознают ... "

Я сделал попытку с двумя разными видео, оба из которых загружают и обрабатывать нормально, когда я делаю это вручную . Поэтому я подозреваю, что мой код а) не правильно кодирует видео и / или б) не отправляет мой API запрос правильно.

Ниже описано, как я создаю запрос API PUT и кодирую видео:

Буду признателен за любые предложения о том, что может быть ошибка

Спасибо

P.S. Я не использую клиентскую библиотеку, потому что мое приложение будет использовать возобновляемая функция загрузки. Таким образом, я вручную создаю свой API запросы.

Документация: http://code.google.com/intl/ja/apis/youtube/2.0/developers_guide_protocol_resumable_uploads.html#Uploading_the_Video_File

Код:

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

Ответы [ 2 ]

0 голосов
/ 02 октября 2010

Запрос на отправку выполнен в 2 части ... Вы отправляете заголовок, включая размер видео, который у вас есть ... YouTube отвечает URL-адресом, и вы отправляете видео на этот URL-адрес. Похоже, вы пытаемся отправить все в одном запросе. Что-то вроде этого.

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
0 голосов
/ 13 июня 2010

Я не знаю, какой формат ищет YouTube, но если этот формат должен распознаваться в вашей системе Windows, я предлагаю вам сохранить преобразованное видео в файл на диске, а затем попытаться открыть его.

...