找回密码
 立即注册
搜索
查看: 3151|回复: 11

[软件] 串流引发的疑问:视频解码能力的上限由谁决定?

[复制链接]
     
发表于 2024-1-18 18:56 | 显示全部楼层 |阅读模式
本帖最后由 abcxiawei 于 2024-1-18 19:00 编辑

最近折腾了串流,主要是想云游戏,也试用了不少云游戏平台,然后我发现了一个现象:
这类串流软件都是基于差不多的原理,在被控端实时采集视频然后编码,传输到主控端解码。随着被控端上传的带宽(码率)和帧数的提升,主控端的电脑会因为无法及时的解码,而画面开始延迟(画面声音不同步,画面比声音慢的多,可以达到几秒甚至十几秒),主控端的输入要半天才能反应。但是很有趣的是,它不卡顿,一点都不卡,就是影音不同步。

这个现象是由不同的硬件配置导致的,一开始我还以为是网络,后来一个偶然的契机,我在同一网络条件下使用了不同硬件配置的电脑来做主控端,控制相同的电脑,结果发现它们在同一网络下,性能表现不一样。
简单的说就是,硬件性能越高的的电脑,就能承受更高的带宽(码率)和帧数。配置越低,你就不能开高帧数,否则很快就画面声音不同步了。

我对这个问题刚开始很不理解,因为有另外一个现象,出现影音不同步的时候,不管主控端这边的解码,是通过CPU的软解,还是通过GPU的硬解,CPU占用率或GPU硬编码器的占用率,都没有满载,甚至只有最多20%不到。这让我产生了一个怀疑,就是视频解码这个工作,是否存在一个内定的上限,它并不是如同其它计算工作一样,会吃掉所有计算资源来完成计算,而是达到一定上限后就不再提升,就像游戏中的限制最大帧率一样。比如它就限死了,解码每秒只能60帧,可被控端那边源源不断的输送着每秒144帧的数据过来,那可不就画面越来越慢于声音了。

有这个怀疑是因为视频这个东西长期都是用在电视和电影领域的,而这些领域长期以来都有自身的行业标准,比如30帧,60帧之类的。那么仅仅是把这些软件化的东西,会不会也带有这个限制?

我自己去搜了一下相关的东西,可能我不是视频领域的专业人员,找ffmpeg没有找到可能相关的资料。然后我就又转头去找各家显卡的硬解码资料,但是各家显卡,都只写了它们对各种编码,在某个分辨率下的支持,但是并没有资料证明它们对解码这些视频数据的时候存在,或不存在限制最大帧数的东西?

我不知道这个推论对不对,所以求教一下更专业的人。谢谢
回复

使用道具 举报

     
发表于 2024-1-18 19:40 | 显示全部楼层
显卡:占用不满!=我没尽力

—— 来自 S1Fun
回复

使用道具 举报

     
发表于 2024-1-18 20:01 | 显示全部楼层
感觉是内存瓶颈了
回复

使用道具 举报

     
发表于 2024-1-18 20:10 来自手机 | 显示全部楼层
真上限不存在,假上限比如 ffmpeg 一直都是单线程之类的,显卡调用,各种各样的的原因都有可能造成,具体看环境
回复

使用道具 举报

     
 楼主| 发表于 2024-1-18 20:57 | 显示全部楼层
Xerxes_2 发表于 2024-1-18 20:01
感觉是内存瓶颈了

内存瓶颈?无论是控制端还是被控端都没有发现爆内存啊
回复

使用道具 举报

     
发表于 2024-1-18 21:14 | 显示全部楼层
abcxiawei 发表于 2024-1-18 20:57
内存瓶颈?无论是控制端还是被控端都没有发现爆内存啊

他应该说的是内存带宽,不太了解云游戏,不过要排除这个,你下个hwinfo打开传感器页看看dram读取/写入是不是很高?再用adia64跑下内存带宽测试?
回复

使用道具 举报

     
发表于 2024-1-18 21:56 | 显示全部楼层
简单的没啥用的废话就是

不能性能的终端 对网络io 解码协议 这些的表现自然有差距
而 gpu 性能没有用尽当然是软件没有把硬件用尽的问题 就是涉及到的串流/云游戏服务与解码的协议那的问题了或许
回复

使用道具 举报

发表于 2024-1-18 22:24 | 显示全部楼层
说明那个百分比只能代表某一种运算模式的占用达到了这个值,正如你任务管理器里cpu到了100%的时候,也可能cpu里计算单元过半的逻辑管没有在工作一样这个百分比数值是把那么多计算模式压缩成一维的映射,在很多情况下并没有参考意义

也就是说,当你没有拿到他们是怎么详细得到这个百分比数值的算法时,什么都是白谈,唯一可以确定的仅仅是到了100%的时候你一定得等着它而已
回复

使用道具 举报

     
发表于 2024-1-19 09:00 | 显示全部楼层
显卡还兼顾渲染这块工作画面渲染不过来解码再快也没用 用过,madvr看hdr视频就知道了 23.976视频随便看 59.94就开始掉帧
回复

使用道具 举报

     
发表于 2024-1-19 09:03 | 显示全部楼层
也有可能是串流软件的原因,比如算法上为了保延迟,超过多少毫秒就强制丢帧
回复

使用道具 举报

     
发表于 2024-1-19 09:56 | 显示全部楼层
本帖最后由 hourousha 于 2024-1-19 10:20 编辑

早在十来年前,第二代酷睿,解码1080p(那时还不支持4k)高码率H264视频就能到将近200帧。远远领先当时的N卡和A卡。当然后来N卡的解码性能也上去了。不过现在解码功能上还是I家最强,比如能硬解HEVC 12bit YUV422格式。
视频渲染器有视频渲染器的逻辑,比如解码器出来的NV12/P010帧,要怎么处理它,在DX11_1以前,无法直接将他们作为纹理读取,那么如果要做自定义的scale处理,就得手动将它们lock住复制出来,这个是相对比较耗时的因为会产生stall。到了DX11_1后可以直接sample这些YUV420纹理了,如果渲染器有这方面的实现就会好些。这些都是完全取决于软件实现的。
另外如果说串流,那么作为编码一方,有时要截屏,截屏这块的性能就很微妙,当然如果这边的串流是做在游戏里的,可以直接把framebuffer传给编码器,这样就能提升性能,然后需要做GPU->CPU的内存复制来推流,推流这块的实现,和接收方的NetStream Source处理,学问就更大了,很可能这边需要解码一帧,但需要的数据还不完整还得等,那可不就得延迟。
回复

使用道具 举报

     
 楼主| 发表于 2024-1-19 14:10 | 显示全部楼层
noahhhh 发表于 2024-1-19 09:03
也有可能是串流软件的原因,比如算法上为了保延迟,超过多少毫秒就强制丢帧
...

如果是丢帧,那画面应该会有卡顿,毕竟丢帧后帧和帧之间差别过大。

但问题是,我的一点卡顿都没有,动态画面的过渡是非常自然的,就是慢,比声音慢很多,我想来想去,只有可能是我这边播放的慢导致的,比如对面1秒送了144帧过来,我这边1秒只能解码60帧,还剩下84帧在排队等着,那画面岂不就是慢了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-9-20 17:43 , Processed in 0.194822 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表