mdk-sdk icon indicating copy to clipboard operation
mdk-sdk copied to clipboard

4k av1 播放卡顿

Open orency opened this issue 3 years ago • 19 comments

4k分辨率av1编码的文件, 播放画面明显一顿一顿,不流畅. 无论mft:d3d=0还是mft:d3d=11 均是如此 1080p av1 是可以流畅播放的 MDK 0.13.0 (git bea9310) 相同环境用ffplay和potplayer均很流畅,尽管是用的不支持硬解av1的显卡 log如下 log-hard.txt log-soft.txt

orency avatar Jan 18 '22 11:01 orency

log里看不出什么原因,加上环境变量MDK_LOG_STATUS=1会打印时间信息。用DecodeFps.exe -c:v MFT:d3d=11 ...可以看看解码能达到多少。mft的软解性能很差,会卡不意外。你可以找个libdav1d.dll放进来然后-c:v dav1d看看解码效果。potplayer是用硬解吗?

wang-bin avatar Jan 18 '22 14:01 wang-bin

你也可以对比不设置解码器,会调用ffmpeg,ffmpeg好像会自动调用av1的硬解。另外ffplay的日志也可以发一下

wang-bin avatar Jan 18 '22 14:01 wang-bin

log里看不出什么原因,加上环境变量MDK_LOG_STATUS=1会打印时间信息。用DecodeFps.exe -c:v MFT:d3d=11 ...可以看看解码能达到多少。mft的软解性能很差,会卡不意外。你可以找个libdav1d.dll放进来然后-c:v dav1d看看解码效果。potplayer是用硬解吗?

环境变量不知设置在哪里,无论设置在系统还是主程序都没看见什么时间信息 DecodeFps.exe 不知为什么只能看见cpu占用提高,并不能显示出什么信息 potplayer应该是软解,我的显卡并不支持硬解av1 拿vlc的libdav1d.dll来用会直接闪退 logdav1d.txt 不设置解码器的情况下24帧率文件卡顿较轻微肉眼不易察觉,60帧率文件依旧肉眼可见卡顿. 并且主动设置解码器为FFmpeg会直接崩溃.崩溃日志如下 log10.txt ffplay正常日志 ffplay.log 测试用的4k av1 60帧视频下载自https://www.youtube.com/watch?v=xmESOGcXjmI 这种剧烈运动的视频与potplayer对比卡顿尤为明显

orency avatar Jan 18 '22 18:01 orency

我测了下这里下载的libdav1d.dll没问题 https://code.videolan.org/videolan/dav1d/-/pipelines

ffplay检测到不支持硬解会使用dav1d。我这边后面改下,默认不设解码器的话也自动使用dav1d

wang-bin avatar Jan 19 '22 02:01 wang-bin

decodefps 输出:

$ ./DecodeFps -c:v  dav1d /d/v/wanderers.mp4
MDK 0.13.0 (git 33a29de) - Multimedia Development Kit. Copyright (c) 2016-2022 WangBin(QtAV author) <wbsecg1 at gmail.com>
Build for: Windows0x0600 x86_64; MSVC1930; MSVCRT14.30.30705.0/msvcp140.dll; 16:30:32 Jan  9 2022
usage: D:\install\mdk-sdk\bin\x64\DecodeFps.exe [-c:v DecoderName] [-from milliseconds] file
decoded: 273, elapsed: 667, fps: 409.3/450.7409.3/450.7, fmt: 1019212016
invalid frame. eof?
frame count: 273, render count: 274

wang-bin avatar Jan 19 '22 02:01 wang-bin

最新的包支持不设置解码器时自动回退到dav1d(libdav1d.dll要存在)

wang-bin avatar Jan 19 '22 06:01 wang-bin

最新的包支持不设置解码器时自动回退到dav1d(libdav1d.dll要存在)

经测试MDK 0.13.0 (git ba413b6) 不设置时仍旧是有人眼能感知到的跳帧感 log13.txt 日志中两个Error也不知有没有联系 但主动将解码器设置为dav1d时则完全流畅,毫无卡顿跳帧感 日志也能看到是直接调用dav1d而非ffmpeg 且cpu与gpu占用均比不设置解码器时低10-20个百分点 decodefps.exe确实毫无信息,只能看见它把cpu占高了,但framereader.exe有fps跳动的信息,不清楚是不是平台的原因

orency avatar Jan 19 '22 10:01 orency

从log看并没有调用dav1d也没解码出画面,log发错了?

wang-bin avatar Jan 19 '22 11:01 wang-bin

从log看并没有调用dav1d也没解码出画面,log发错了?

是发错了,那个是主动设置解码器为FFMPEG时日志,只有声音没有画面 不设置解码器的日志 01-19 19-58-14.txt

orency avatar Jan 19 '22 12:01 orency

从log看并没有调用dav1d也没解码出画面,log发错了?

是发错了,那个是主动设置解码器为FFMPEG时日志,只有声音没有画面 不设置解码器的日志 01-19 19-58-14.txt

你这个是调了MFT:d3d=11,默认什么解码器都不设会走dav1d。你是用哪个程序测的?对了,你是什么显卡?你用dxvachecker看下你的显卡是否支持av1硬件,不能硬解的话MFT:d3d=11没报错我倒是第一次碰到,行为跟硬解一样。framereader用各解码器给出的帧率是多少?

wang-bin avatar Jan 19 '22 13:01 wang-bin

显卡是Radeon Graphics(Renoir),amd的核显.测下来不支持av1硬解 测试程序是qt示例qmdkplay,qt msvc 6.2.2,win11 dav1d解码 decoded: 13844/1, elapsed: 164122, fps: 84.4/207.8 decoded: 13844/1, elapsed: 159769, fps: 86.7/227.0 MFT:d3d=11解码 decoded: 13844/1, elapsed: 208358, fps: 66.4/146.8 MFT:d3d=0解码 decoded: 13844/1, elapsed: 195266, fps: 70.9/180.8 不设置解码器 decoded: 13844/1, elapsed: 159119, fps: 87.0/219.2 FFmpeg、D3D11、DXVA解码器均报invalid frame.

不报错的原因好像是我装了微软商店的av1videoextension, dxvachecker可以直接调用这个av1decodermft_store.dll播放, 但它的cpu占用比dav1d还低,应该效率比dav1d还要高,完全不跳帧 不清楚问题出在哪里

orency avatar Jan 19 '22 15:01 orency

你的显卡应该支持av1硬解的。可以运行framereader -c:v MFT:d3d=11 a.mp4 然后看任务管理器gpu使用率变化 image

你这边卡顿有可能和opengl渲染有关,你用d3d11渲染试试,glfwplay.exe -c:v MFT:d3d=11 -d3d11 a.mp4,或者运行install.bat,然后文件右键选择glfwplay播放

wang-bin avatar Jan 20 '22 01:01 wang-bin

-c:v D3D11也可以试试,如果能硬解的话这个也可以解码

wang-bin avatar Jan 20 '22 02:01 wang-bin

-c:v D3D11 无法播放,它的MFT:d3d=11 播放能力确认来自AV1 Video Extension ,把这个插件卸载后MFT:d3d=11也无法播放 gpu占用只有12% ,cpu却达到60%,是软解无疑 d3d11渲染感觉差别不大,仍旧有轻微跳帧感,特别是有移动镜头长画面时,dav1d解码明显是连贯顺畅的,MFT:d3d=11则有些许不连贯跳帧感,但谈不上严重卡顿 但dxvachecker调用AV1 Video Extension的av1decodermft_store.dll播放,则很顺滑与glfwplay调dav1d表现相同.

orency avatar Jan 20 '22 07:01 orency

glfwplay加上参数-fps -1会以最快的速度解码和渲染,你看看有没有卡顿,如果没有的话应该是我音视频同步的问题

wang-bin avatar Jan 30 '22 09:01 wang-bin

glfwplay加上参数-fps -1会以最快的速度解码和渲染,你看看有没有卡顿,如果没有的话应该是我音视频同步的问题

在MDK 0.13.0 (git 8f7983f)测试, MFT:d3d=11加这个参数反而加剧了这种现象,且音频完全不同步了 后来意识到之前表述其实是不准确的,其实是一种帧率略快而跳帧的快进感而非卡顿感 因为dav1d加上这个参数与MFT:d3d=11现象是类似的

奇怪的是MFT:d3d=11下player_->mediaInfo().video[0].codec.frame_rate得到的帧率也是正确的 更怪的是手动setFrameRate()为该文件正确帧率,没有快进感了,但画面速度反而过慢了,当然音频也不同步了

另外问下为何mediainfo要播放几秒才能获取,setmedia之后立即获取,它的几个属性值均为0?

orency avatar Jan 30 '22 18:01 orency

你用最新的dll再发个完整log

wang-bin avatar Feb 16 '22 04:02 wang-bin

你用最新的dll再发个完整log

MDK 0.14.0 (git f7623f2) logs.txt 这版本MFT:d3d=11音视频完全不同步了😎画面比声音慢好多

orency avatar Feb 25 '22 23:02 orency

glfwplay加上参数-fps -1会以最快的速度解码和渲染,你看看有没有卡顿,如果没有的话应该是我音视频同步的问题

在MDK 0.13.0 (git 8f7983f)测试, MFT:d3d=11加这个参数反而加剧了这种现象,且音频完全不同步了

-fps -1 是尽可能快地解码和渲染,不管音视频同步

后来意识到之前表述其实是不准确的,其实是一种帧率略快而跳帧的快进感而非卡顿感

跳帧 应该不至于

奇怪的是MFT:d3d=11下player_->mediaInfo().video[0].codec.frame_rate得到的帧率也是正确的

这个是视频的固有信息,和播放状态没关系

另外问下为何mediainfo要播放几秒才能获取,setmedia之后立即获取,它的几个属性值均为0?

要在视频加载完成时去读取,可以参考 https://github.com/wang-bin/mdk-examples/blob/master/Native/MediaInfoReader.cpp#L23 、https://github.com/wang-bin/mdk-examples/blob/master/Native/offscreen.cpp#L43 、https://github.com/wang-bin/mdk-examples/blob/master/Native/offscreen.cpp#L23

你用最新的dll再发个完整log

MDK 0.14.0 (git f7623f2) logs.txt 这版本MFT:d3d=11音视频完全不同步了😎画面比声音慢好多

也没改相关的代码,挺奇怪的。我这边测了一台能硬解av1的机子,glfwplay -c:v MFT:d3d=11 -d3d11 播放8k 10bit hdr 60fps 在全屏模式下(F键切换)是流畅的,非全屏一卡一卡,但解码速度和渲染速度是没问题的,这个也不清楚为什么。

wang-bin avatar Mar 06 '22 15:03 wang-bin