我试图通过图形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只支持长达一分钟的文件
之后,一切都正常了🎉