我正在使用.NET来创建视频上传应用程序。虽然是的 与YouTube通信并上传文件,处理 那个文件失败了。 YouTube向我显示错误消息“上传失败 (无法转换视频文件)。“这应该意味着”你的 视频的格式是我们的转换器无法识别的......“
我尝试了两个不同的视频,两个视频都上传了 当我这样做时,处理正常手动。所以我怀疑我的代码是 a。)没有正确编码视频和/或b。)不发送我的API 请求正确。
以下是我构建API PUT请求和编码的方法 视频:
任何有关错误可能的建议都将受到赞赏。
由于
P.S。我没有使用客户端库,因为我的应用程序将使用 可恢复的上传功能。因此,我手动构建我的API 请求。
代码:
// 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 :(得分:0)
我不知道YouTube正在寻找什么格式,但如果它是一种应该在Windows系统上可识别的格式,我建议您将转换后的视频保存到磁盘上的文件中,然后尝试打开它。
答案 1 :(得分:0)
发送请求分为2部分...您发送标题,包括视频大小... YouTube用网址回复,然后您将视频发送到该网址..看起来像你正试图在一个请求中发送所有内容。有点像这样。
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