我遇到了TweetInvi 0.9.9.7上传视频失败的问题。这个视频是一个9MB的MP4视频,我可以通过网络界面把它上传到twitter上。我得到的错误信息是:
这条推特不能像一些媒体一样发布发表!
我使用fiddler,可以看到这个错误消息从API返回:
error=segment size必须为<= 1.
据其中一名开发人员称,当一个超过5MB的视频试图上传到Twitter,而不是以块的形式发送时,就会出现这个错误。https://twittercommunity.com/t/append-call-in-video-upload-api-giving-error/49067
这是我的代码,我做错了什么?上传小于5MB的文件可以正常工作,但官方API规范支持最大15MB的视频
Auth.ApplicationCredentials = new TwitterCredentials("blahblahblah", "censoring private key", "***private, keep out***", "***beware of dog***");
var binary = File.ReadAllBytes(VideoPath);
Tweet.PublishTweetWithVideo("Here is some tweet text", binary);
最终,我发现了这种没有记录的美:Upload.CreateChunkedUploader();
这暴露了我上传这个大文件所需的功能。下面是我的新工作代码,供其他可能遇到此问题的人使用。
var chunk = Upload.CreateChunkedUploader(); //Create an instance of the ChunkedUploader class (I believe this is the only way to get this object)
using(FileStream fs = File.OpenRead(VideoPath))
{
chunk.Init("video/mp4", (int)fs.Length); //Important! When initialized correctly, your "chunk" object will now have a type long "MediaId"
byte[] buffer = new byte[4900000]; //Your chunk MUST be 5MB or less or else the Append function will fail silently.
int bytesRead = 0;
while((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
{
byte[] copy = new byte[bytesRead];
Buffer.BlockCopy(buffer, 0, copy, 0, bytesRead);
chunk.Append(copy, chunk.NextSegmentIndex); //The library says the NextSegment Parameter is optional, however I wasn't able to get it to work if I left it out.
}
}
var video = chunk.Complete(); //This tells the API that we are done uploading.
Tweet.PublishTweet("Tweet text:", new PublishTweetOptionalParameters()
{
Medias = new List<IMedia>() { video }
});
重要的结论:
- 上传大于5mb的文件时,必须先将其拆分。
- TweetInvi已经有一个机制来处理这个限制,我只是找不到任何文档。
- API对每个视频文件有15mb的硬限制。尽管twitter的支持网站声称它可以处理512MB
注意:如果选择的视频不支持格式。最大文件大小为512MB。详情请参阅此处格式。