Twitter API v2视频上传异常:状态持续in_progress且报InvalidMedia错误
in_progress,提示InvalidMedia错误的解决办法 问题详情
上传视频时,处理状态始终卡在in_progress(进度99%),同时返回InvalidMedia错误,提示file is invalid,错误响应如下:
object(stdClass)#9 (5) { ["media_id"]=> int(1682626180757979138) ["media_id_string"]=> string(19) "1682626180757979138" ["media_key"]=> string(21) "7_1682626180757979138" ["size"]=> int(3740488) ["processing_info"]=> object(stdClass)#12 (3) { ["state"]=> string(11) "in_progress" ["progress_percent"]=> int(99) ["error"]=> object(stdClass)#13 (3) { ["code"]=> int(1) ["name"]=> string(12) "InvalidMedia" ["message"]=> string(15) "file is invalid" } } }
使用的PHP代码:
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token, $access_token_secret); $media = $connection->upload('media/upload', ['media' => '/path/to/file/kitten.mp4'], true); $limit = 0; do{ $status = $connection->mediaStatus($media->media_id_string); sleep(5); $limit++; }while($status->processing_info->state !== 'succeeded' && $limit <= 3); $parameters = [ 'status' => 'Meow Meow Meow', 'media'=> ['media_ids' => $media->media_id_string] ]; $connection->setApiVersion('2'); $result = $connection->post('tweets', $parameters, true);
可能的原因及解决步骤
视频格式/编码不符合Twitter要求
Twitter对上传视频有明确限制,必须满足:- 容器格式:MP4或MOV
- 视频编码:H.264(基线、主或高配置,最高级别5.2)
- 音频编码:AAC-LC(最高192kbps)
- 分辨率:32x32至1920x1200(或1200x1920)
- 时长:0.5秒到140秒
- 文件大小:普通账号最大512MB
可以用FFmpeg转换视频到合规格式,示例命令:
ffmpeg -i kitten.mp4 -c:v libx264 -profile:v baseline -level 3.0 -c:a aac -b:a 128k compliant_kitten.mp4文件路径或权限问题
先确认视频路径正确,且PHP进程有读取权限,可在代码开头添加验证:$videoPath = '/path/to/file/kitten.mp4'; if (!file_exists($videoPath)) { die('视频文件不存在'); } if (!is_readable($videoPath)) { die('无视频文件读取权限'); }改用分块上传方式
超过15MB的视频必须用分块上传,替换原单文件上传代码:// 初始化上传 $media = $connection->upload('media/upload', [ 'command' => 'INIT', 'media_type' => 'video/mp4', 'total_bytes' => filesize($videoPath) ], true); // 分块上传 $chunk = 0; $handle = fopen($videoPath, 'rb'); while (!feof($handle)) { $chunkBytes = fread($handle, 5242880); // 每次上传5MB $connection->upload('media/upload', [ 'command' => 'APPEND', 'media_id' => $media->media_id_string, 'segment_index' => $chunk, 'media' => $chunkBytes ], true); $chunk++; } fclose($handle); // 完成上传 $media = $connection->upload('media/upload', [ 'command' => 'FINALIZE', 'media_id' => $media->media_id_string ], true);优化状态轮询逻辑
原轮询次数太少(仅3次),且未处理错误终止,修改为:$limit = 0; $maxAttempts = 10; $isSuccess = false; do { $status = $connection->mediaStatus($media->media_id_string); // 检测到错误直接终止 if (isset($status->processing_info->error)) { error_log('视频处理失败:' . $status->processing_info->error->message); break; } if ($status->processing_info->state === 'succeeded') { $isSuccess = true; break; } sleep(5); $limit++; } while ($limit < $maxAttempts); if (!$isSuccess) { die('视频处理超时或失败'); }
内容的提问来源于stack exchange,提问作者user22261714

