4719373@163.com

4719373@163.com

0个粉丝

30

问答

0

专栏

1

资料

4719373@163.com  发布于  2017-03-03 09:40:10
采纳率 0%
30个问答
6537

求一在WINDOWS下H264 H265解码显示平滑处理的思路

 
求一在WINDOWS下H264 H265解码显示平滑处理的思路

以前用HI3516C做1080P,我是这样处理的:
  一个线程收取音视频数据,然后传入3个队列,
  一个线程队列录像;
  一个线程队列播放音频;
  一个线程队列解码视频及上屏显示
  解码用的是ffmpeg软解码
  上屏显示用的是DirectDraw
  由于1080P图像解码并不太占资源,在我的电脑上,基本一个I帧约40ms,运行剧烈画面的P帧也约

30~40ms,静态画面P帧约10~17ms
  所以,将解码和上屏显示放到一个线程中,没什么问题,画面很平滑。

  现在做HI3516A+IMX178 500W时,问题来了:
还是采用上面的处理方式:
  一个线程收取音视频数据,然后传入3个队列,
  一个线程队列录像;
  一个线程队列播放音频;
  一个线程队列解码视频及上屏显示
  解码用的是ffmpeg软解码
  上屏显示用的是DirectDraw
H264:
  由于2592x1944 500W图像解码时,在我的电脑上,基本一个I帧约50~80ms,运行剧烈画面的P帧也

约50~80ms,静态画面P帧约15~35ms,
  这样,由于某些帧解码时间太长,图像就一顿一顿的。
H265:
  H265就不用谈了,软解码,时间基本上是H264的两倍。

我的解决办法是:
  将解码、上屏显示这一个线程再拆分为两个线程,一个专门解码、一个专门上屏显示。


但是存在的问题是:
  avcodec_decode_video2输出的AVFrame中data只有两个缓存地址在不停地来回切,
  如果我将解码后的YUV420或RGB32数据自己拷贝到一个缓存中,
  一张500W的有近20M,系统内存也会吃不消,拷贝效率也低。


  求思路……
我来回答
回答11个
时间排序
认可量排序

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2017-03-03 10:18:21
认可0
本帖最后由 ngswfx 于 2017-3-3 12:03 编辑

这个应该不是你流程的问题,应该是CPU的事情,既然解码耗时已经超过了40ms,这意味着你无轮怎么调整结构都会卡顿,或者强制丢数据。例如每过几秒,抛弃一部分后面的p帧,直到等到接下来的I帧再继续解码。

这种问题解决的关键就是让用户配更高核心数量以及更高频率的CPU,提升硬件性能解决。至于YUV拷贝,能不拷贝,尽量别拷贝。如果用户对后端解码图像要求不高,可以采用YUV数据抛弃,隔行抛弃,水平和垂直都扔掉一部分数据,这样在显示时,对于500w的图像来说,其实也不会差到哪里去,当然,应用层需要留有开关,随时可以开启。

我以前做软解码,显示部分是独立的,解码后,如果解码得到YUV,就是设置一个标志=true,然后显示线程,是一个定时器,每隔30ms或者40ms左右检查一次,如果发现标志为1,就到相关内存中,取YUV显示,最后效果基本OK。也就是解码和显示是分开的,异步的。而且YUV解码后的数据其实有2-3帧缓冲,这样显示和解码部分不会互相对一个YUV数据帧同时访问。其实海思的硬件解码从SDK结构看,显示部分底层也是有缓冲的,一般是2帧。

但问题的核心,是即便你把它拆分成2个线程,解码和显示分开,最后还是会卡顿的。本质就是解码耗时超过了40ms,这个是命门。不过倒是可以做到均匀抛弃。就是扔后面的那写p帧。如果IPC出来的数据1秒钟一个关键帧,你就扔后面的5帧-10帧 P帧,整个图像均匀卡顿。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-03-03 11:27:55
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=45988&ptid=14392]ngswfx 发表于 2017-3-3 10:18[/url]
这个应该不是你流程的问题,应该是CPU的事情,既然解码耗时已经超过了40ms,这意味着你无轮怎么调整结构都 ...[/quote]

硬件解码卡看来还有活路啊;P

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2017-03-03 12:04:13
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=45995&ptid=14392]zhuangweiye 发表于 2017-3-3 11:27[/url]
硬件解码卡看来还有活路啊[/quote]

:lol,到了高清500W 800W,现有PC多路解码的确费劲。

4719373@163.com

0个粉丝

30

问答

0

专栏

1

资料

4719373@163.com 2017-03-06 18:21:16
认可0
自己顶一下

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2017-03-07 02:50:21
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=46018&ptid=14392]4719373@163.com 发表于 2017-3-3 21:14[/url]
但是,我用vlc 暴风影音等播录像文件,明显不卡,我电脑肯定是不支持硬解码的[/quote]

VLC我不确定,但是暴风影音是有H264硬件解码的,主要是利用显卡硬件,某些计算不使用CPU,而是直接使用GPU了,这些年的显卡都是支持的。

当然,如果支持,暴风影音里面有设置,可以修改为纯CPU解码的。

你的PC是什么cpu,显卡什么型号?

当然,你的流程的确可以拆分,肯定比你现在要好一些,最起码可以利用多核心性能,否则,视频解码部分,一个通道你只用了一个cpu核心,如果拆分为2个线程,如果解码线程占用了大量时间,显示时,其实会使用另外的cpu核心,这样流畅度肯定比现在要好一些。

4719373@163.com

0个粉丝

30

问答

0

专栏

1

资料

4719373@163.com 2017-03-08 11:08:02
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=46141&ptid=14392]ngswfx 发表于 2017-3-7 02:50[/url]
VLC我不确定,但是暴风影音是有H264硬件解码的,主要是利用显卡硬件,某些计算不使用CPU,而是直接使用 ...[/quote]

2011年买的ACER 4738ZG
CPU P6200双核 2.13G  显卡 ATI什么的独显

虽然本本年纪是老了点,但比现在2017年出的5000块以下的本本性能还强,
同时解4个1080P不成一点问题。

4719373@163.com

0个粉丝

30

问答

0

专栏

1

资料

4719373@163.com 2017-03-08 11:42:24
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=46141&ptid=14392]ngswfx 发表于 2017-3-7 02:50[/url]
VLC我不确定,但是暴风影音是有H264硬件解码的,主要是利用显卡硬件,某些计算不使用CPU,而是直接使用 ...[/quote]

我刚分析了一下VLC,有个显卡DirextX DXVA硬件加速功能,我的电脑上VLC这个功能是关掉的
VLC 用 rtsp
----------------------------------------------
1080P, 30fps
我开 300ms 缓存 占内存 95M
我开 500ms 缓存 占内存111M
我开1000ms 缓存 占内存156M

按1080P一帧 1920*1080*2 算,一帧解码后的YUV420约4M
1000ms 30*4=120M
500ms 15*4= 60M
300ms 10*4= 40M
----------------------------------------------
500W, 20fps
我开 300ms 缓存 占内存142M
我开 500ms 缓存 占内存172M
我开1000ms 缓存 占内存246M

按500W一帧 2592*1944*2 算,一帧解码后的YUV420约10M
1000ms 20*10=200M
500ms 10*10=100M
300ms  6*10= 60M

再加上VLC本身占用的内存,基本上可以断定

VLC是将解码后的YUV420,存在一个缓存内存中了,而不是直接上屏显示的
看来这个方法还是可行,只是太占内存了

感谢你了

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2017-03-09 01:22:27
认可0
本帖最后由 ngswfx 于 2017-3-9 01:23 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=46261&ptid=14392]4719373@163.com 发表于 2017-3-8 11:42[/url]
我刚分析了一下VLC,有个显卡DirextX DXVA硬件加速功能,我的电脑上VLC这个功能是关掉的
VLC 用 rtsp
- ...[/quote]

不客气,对于VLC这些解码程序,我估计它有2个缓冲,共同产生了300ms或者500ms延迟。

其中一个缓冲是压缩的编码帧缓冲,也就是先把网络得到的H264数据帧送入一个循环队列,然后解码线程负责定时去解码(33ms或者40ms),通过改变这个缓冲的大小,也就是缓冲几帧,来解决网络发送过程中可能产生的卡顿。

另外解码后的YUV数据也送入一个YUV显示缓冲当中,这样做的好处,我感觉主要是可以利用双核,因为解码和显示都是费时的动作,如果分开成为2个线程,可以充分利用不同核心,当然不排出还有其他好处。

我以前搞PC解码,这2种缓冲,底层都使用了,根据不同情况,可以上层调整,因为某些IPC或者NVR流有些差异,另外网络状态不同也有不少差异,另外,有的情况需要极高的实时特性,例如云台控制,而有的时候又需要很好的平滑度,就是图像流畅度,为此上层可以动态调整,例如云台控制时,就立刻抛弃开始所有的YUV缓冲,直接送最后一个,并且对现有积存的编码压缩数据,也要立刻抛弃,直到发现最后一个关键帧,这样云台控制,就可以立刻体现出来,否则需要等好一会图像才动。每种缓冲,一般3-12帧,但对于高清图像,YUV缓冲太费劲了,太占用内存以及显卡带宽或者说CPU拷贝的带宽了。你可以尝试调整不同机制,反正就是内存拷贝

darcy_lu

0个粉丝

0

问答

0

专栏

0

资料

darcy_lu 2017-03-09 14:06:10
认可0
cpu 支持硬解码就好了啊

4719373@163.com

0个粉丝

30

问答

0

专栏

1

资料

4719373@163.com 2017-03-03 21:14:58
认可0
但是,我用vlc 暴风影音等播录像文件,明显不卡,我电脑肯定是不支持硬解码的

4719373@163.com

0个粉丝

30

问答

0

专栏

1

资料

4719373@163.com 2017-03-12 12:36:24
认可0
这个问题搞定了,拆成两个线程,一个解码,一个显示,图像很平滑,就是有点吃内存
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区