5

.NET を使用してビデオ アップロード アプリケーションを作成しています。YouTube と通信してファイルをアップロードしていますが、そのファイルの処理は失敗します。YouTube で「アップロードに失敗しました (動画ファイルを変換できません)」というエラー メッセージが表示されます。これはおそらく、「あなたの動画は当社のコンバーターが認識できない形式です...」という意味です。

私は 2 つの異なるビデオを試してみましたが、どちらも手動でアップロードして正常に処理されました。したがって、私のコードは a.) ビデオを適切にエンコードしていない、および/または b.) API リクエストを適切に送信していないと思われます。

以下は、API PUT リクエストを作成してビデオをエンコードする方法です。

エラーが何であるかについての提案をいただければ幸いです。

ありがとう

PS 私のアプリケーションは再開可能なアップロード機能を使用するため、クライアント ライブラリは使用していません。したがって、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
4

2 に答える 2

0

送信リクエストは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
于 2010-10-02T08:22:01.150 に答える
0

YouTube が探している形式はわかりませんが、Windows システムで認識できる形式である場合は、変換したビデオをディスク上のファイルに保存してから、開いてみることをお勧めします。

于 2010-06-13T08:01:14.117 に答える