ffmpeg - FFmpeg 流式传输低 CRF 导致质量低下
问题描述
我正在使用以下参数与 FFmpeg 进行流式传输(实时聊天)。
ffmpeg -f dshow -rtbufsize 100M -i video="device":audio="device" \
-c:v libx264 -crf 30 -preset ultrafast -tune zerolatency \
-c:a aac -f mpegts udp://127.0.0.1:1234
没想到,当 CRF 从 30 降到 20 时,一步步降下来。流质量急剧下降。当 CRF 大约为 20 时,画面的突然变化(如头部运动),似乎使图像变为绿色、灰色或非常失真。我尝试使用 CRF 30,问题似乎消失了。为什么会这样?
鉴于我在本地主机上,我认为这不是带宽问题。此外,我没有根据 I 帧进行任何更改。
编辑:我检查了在 libx265 上给定 CRF 20 和 CRF 30 的文件大小。
10秒视频。
CRF 20: 1.7M
CRF 30: 350kb
对于 localhost 或任何其他直播服务无法处理的 10 秒流,1.7M 真的很糟糕吗?
解决方案
我不知道分辨率是什么,但这似乎是编码的性能问题。CRF=20 也可用于最高 20 Mbps 作为 720p 的标准。作为建议,不要使用 CRF,而是根据分辨率指定适当的比特率。720p -> 2.5Mbps 1080p -> 4Mbps
而且'dshow'也不是很快捕获。你必须考虑到它。我推荐 DX10 的交换链。这是超级快速的捕获器。
推荐阅读
- shell - 父进程终止后shell脚本不终止子进程
- docker - 运行自定义 Docker 映像作为云构建中的一个步骤
- java - 方法的局部变量是否由线程共享?
- azure-devops - 如何使用 Azure 管道将 TFVC 标签与最新源代码进行比较
- android - 有什么办法可以防止颤动应用程序的屏幕截图和屏幕记录?
- angular5 - 如何隐藏默认显示页面加载时间的formio加载器
- c - 如何修复链接器警告:内核空间中的“函数未定义”?
- reactjs - formik 在 onSubmit 处理程序中访问 initialValues 以与值进行比较
- angular - 如何使用角度编辑器上传图像和附加文档
- python - 如何在套件设置中运行测试用例?