video - 对上传到我的应用程序的视频进行转码有哪些好的设置?
问题描述
我正在开发一个允许用户分享视频的应用程序。问题是许多视频的比特率非常高。例如,来自旧 iPhone 的 4 分钟 H264 视频以 1080p 编码,运行速度约为 17,000 kb/s(约 500 兆字节)。以这种比特率/分辨率接受和分发此类视频对于社交应用程序来说是不切实际的。
我一直在使用 ffmpeg 将视频转码为更小尺寸和更高压缩率,但没有达到可接受的结果。例如:
ffmpeg \
-i in.mov \
-vf scale=w='if(gt(iw\,ih)\,780\,-2)':h='if(gt(iw\,ih)\,-2\,780)' \
-c:v libx264 \
-crf 28 \
-preset medium \
-pix_fmt yuv420p \
-movflags +faststart \
out.mp4
此命令将上述 500MB 文件转码为 70MB。它将视频的较大尺寸缩放到 780 像素,并对视频进行了相当多的压缩。结果还可以,但文件仍然很大。
将较长的尺寸降低到 480 像素,文件减小到 40MB。仍然很大,现在显着退化。此外,转码仍然需要相当长的时间:在我 4 岁的 i7 Macbook Pro 和 16GB RAM 上大约需要 1-1.5 倍。
我不确定如何改进这一点。浏览器不支持 H265。我想知道:
- 如何进一步减小尺寸?
- 如何在不显着降低质量的情况下以超过 1 倍的速度进行转码?即使是 2-3x 似乎也不是很好?
这是最好的吗?
解决方案
Is this as good as it gets?
是的。视频编码中没有免费的午餐。
如果机器有硬件编码器,如某些英特尔 CPU 上的 QuickSync,或 Nvidia Gpus 上的 nvenc(或某些 Mac/iOS 上的 videotoolbox),您可以加快编码速度。但文件大小将相同,甚至更大。
推荐阅读
- angular - 角度 2 显示单击行的浮动 div
- ruby-on-rails - 在 Rails 中有很多关联
- server-side - 服务器端事件和 Web hook [反向 API] 有什么区别?
- angular - 在 ngOnDestroy 回调中完成 Output() 事件发射器
- java - Resttemplate - 请求 pojo 本身或请求 json 字符串并解析它
- sql - SQL Server 中的 SUBQUERY 和 EXISTS
- java - 在 MySQL 中删除和添加条目时,int ID 会跳转数字
- kotlin - 以毫秒为单位计算年数 否定答案
- html - 如何在表格中创建下拉菜单?
- python - 检查是否使用 python 打开了搅拌机的控制台?