Facebook Graph API-试图上传视频时出现错误2207026



我试图通过图形API上传视频,但正如标题所述,我收到一个错误,指出我使用了不支持的视频格式。

我想可能原始视频文件与上定义的视频规范不匹配https://developers.facebook.com/docs/instagram-api/reference/ig-user/media#video-规范,所以我写了一个函数来转换文件以匹配规范,使用ffmpeg和以下命令(我尝试了许多不同的命令,但这是我最后一次尝试(

ffmpeg -i ${tmpInFile} -vf format=yuv420p -vf scale=-2:720 -pix_fmt yuv420p -r 30 -movflags +faststart -c:v libx264 -b:v 3M -c:a aac -b:a 128k -ac 2 -ar 44100 -shortest -f mp4 ${tmpOutFile}

不幸的是,错误仍然存在。

以下是完整的流程:

首先,我使用await fetch('/api/convert-mp4', { method: 'POST', body: file });将上传的视频文件发送到后端。

接下来,我使用const blob = await request.blob();从请求中获取blob数据。

然后我用await fs.writeFile(tmpInFile, await blob.stream())创建了一个临时文件。

然后我用上面提到的命令调用ffmpeg,然后用const buffer = await fs.readFile(tmpOutFile);读取文件。

然后,我用return {status: 200,body: buffer}将缓冲区作为响应体发送回客户端。

然后我用const blob = await convertVideoResponse.blob();从响应中获得blob数据。

最后,我用const convertedFile = new File([blob], file.name, { type: 'video/mp4' });

我将此文件上传到Supadase Storage(https://supabase.com/storage),并获得一个可公开访问的url(我通过匿名标签打开它来确认(。

在超级数据库面板中,我可以看到视频文件具有正确的媒体容器(video/mp4(,并且文件大小足够小。

有人知道可能是什么问题吗?

编辑:

通过将ffmpeg命令更改为使用h265而不是h254ffmpeg -i ${tmpInFile} -vf format=yuv420p -vf scale=-2:1350 -pix_fmt yuv420p -r 30 -movflags +faststart -c:v libx265 -vtag hvc1 -an -x265-params crf=25 -b:v 3M -c:a copy -c:a aac -b:a 128k -ac 2 -ar 44100 -shortest -f mp4 ${tmpOutFile},我设法使其适用于某些视频,但不是所有视频,这让我感到困惑,因为我认为由同一命令处理的所有视频的视频属性都应该相同。

我遇到了同样的问题,并成功了!

TL;DR

确保你的视频不是太长

更多详细信息

最后,我想出了一个例子:

ffmpeg -i input.mp4 
-c:v libx264 -aspect 16:9 -crf 18 
-vf "scale=iw*min(1280/iw,720/ih):ih*min(1280/iw,720/ih),pad=1280:720:(1280-iw)/2:(720-ih)/2" 
-fpsmax 60 -preset ultrafast -c:a aac -b:a 128k -ac 1 -pix_fmt yuv420p -movflags +faststart -t 59 -y output.mp4

在一些标志上,一些关于什么和为什么的细节:

  • -c:v libx264→您需要使用视频编解码器进行压缩:HEVC或H264,逐行扫描,闭合GOP,4:2:0色度子采样
  • --aspect和-vf "scale=iw*min(1280/iw,720/ih):ih*min(1280/iw,720/ih),pad=1280:720:(1280-iw)/2:(720-ih)/2"→因为我希望我的视频始终在1280x720以内,如果需要,可以添加填充
  • fpsmax→确保帧速率不超过60fps
  • -c: aac-b:128k-ac 1→对于";AAC,最大48khz采样率,1或2个声道(单声道或立体声(">
  • -t 59→限制在1分钟以下,因为这是视频的最大值

我认为这里最重要的是-t 59,因为API只支持长达一分钟的文件

之后,一切都正常了🎉

最新更新