ffmpeg - ffmpeg 输出文件大小的增长速度快于电影长度的线性增长
问题描述
我正在使用 ffmpeg 将一些 .bmp 图像串在一起成电影。总共有 1001 帧,长度为 0:40。我正在使用的命令是
ffmpeg -f image2 -i render.%05d.bmp -c:v libx264 -s 512:268 render.mp4
输出文件大小为 33,2 MB,大约是相同长度的全高清视频大小的两倍(大约是像素的 16 倍!)。除了文件大小大得不合理之外,我意识到它的增长速度比线性增长快(无法准确判断它是否是二次的、指数的等)随着帧数的增长。100 帧后它大约有 1536 KB 大(这已经太大了),500 帧后它已经是 15104 KB,1001 帧后它最终达到了 34085 KB。
我有根据的猜测是,对于每一帧,它都会再次存储有关所有先前帧的一些信息,这绝对没有意义。
我究竟做错了什么?在向我推荐 libx265 之前:它将整个视频变成绿色。
解决方案
利用:
ffmpeg -i render.%05d.bmp -c:v libx264 -vf "scale=512:-2,format=yuv420p" -movflags +faststart output.mp4
- 如果输出文件太大,请按照FFmpeg Wiki: H.264
-crf
中的说明添加和-preset
选项。 - 如果输出仍然太大变化
-c:v libx264
,-c:v libx265
但编码会变慢。由于像素格式,当您尝试 x265 时,您的输出为绿色:使用format=yuv420p
如我的示例中所示将解决该问题。请参阅FFmpeg 维基:H.265。 - 如果您的目标是特定的输出文件大小,则使用两遍
-b:v
(参见上面的任一链接)。
推荐阅读
- python - Pyinstaller - 转换为 .exe 的 python 脚本未按预期方式执行程序
- r - 在 gg 图中标记下一个点
- android - 使用 RNFetchBlob 从存储中删除文件
- php - Laravel:两个模型路由绑定没有关系
- angular - DOM 异常:标头名称无效
- laravel - Laravel:在 created_at 和 updated_at 之间切换
- scala - 如何过滤以某事开头并以某事结尾的数据框列
- c# - 如何在 azure 函数的堆栈跟踪中显示文件名和行号
- angular - Angular SignalR 不适用于 AWS 负载均衡器代理 URL
- java - 未找到 id 0x7f0a01a2 的视图...片段