【问题标题】:FFmpeg streaming low CRF results in low qualityFFmpeg 流式传输低 CRF 导致低质量
【发布时间】:2019-12-16 22:47:06
【问题描述】:

我正在使用以下参数与 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 真的很糟糕吗?

【问题讨论】:

  • 我认为这不是带宽问题,因为我在本地主机上。 --> 通过保存到文件并检查来确认。
  • @Gyan 请检查编辑。
  • 您报告了文件大小,但您最初的问题是质量问题。 20对30的质量如何?
  • @Gyan 当然 20 更好,但是我不需要实时聊天程序中的质量。我仍然会使用最好的。这就是我深入研究它的原因。
  • @Gyan 请注意,当保存到文件时,两种质量都是可以接受的,在实时解码时,20 crf 给出绿色、模糊、灰色的图像。 (在突然的运动中,正如我所经历的)

标签: ffmpeg video-streaming h.264 live-streaming video-encoding


【解决方案1】:

我不知道分辨率是多少,但这似乎是编码的性能问题。 CRF=20 也可用于最高 20 Mbps 作为 720p 的标准。 作为建议,不要使用 CRF,而是根据分辨率指定适当的比特率。 720p -> 2.5Mbps 1080p -> 4Mbps

而且“dshow”的捕获速度也不是很快。你必须考虑到它。 我推荐 DX10 的交换链。这是超快速的捕获器。

【讨论】:

  • 分辨率为 640x480。我在编辑中添加了文件大小。另外,我在哪里可以找到有关 DX10 交换链的更多信息?它在 DX11 和 12 上可用(以及更好的性能)吗?
  • 如果你使用那个分辨率,你很难惹上麻烦。我认为您最好查看编码选项。并参考这个链接。;; docs.microsoft.com/ko-kr/windows/win32/api/dxgi/…
  • 我建议将 [CRF] 替换为 [-b:v 840k](范围:750k~1000k)
  • 如果你真的想使用CRF,使用这个值[24](范围:23~25)
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 2016-11-28
  • 2015-11-23
  • 2015-07-21
相关资源
最近更新 更多