[Bug]: Linux平台下无法使用nvdec解码
在使用的时候发生了什么 Bug ?
- 尝试使用mpv nvdec播放视频成功
mpv --hwdec=nvdec ./wallpaper.mp4
client removed during hook handling
● Video --vid=1 --vlang=eng (h264 3360x1440 60 fps) [default]
Using hardware decoding (nvdec).
VO: [gpu] 3360x1440 cuda[nv12]
2.尝试使用kazumi,启用nvdec/nvdec-copy,均无法使用硬件解码单元
3.使用libva-nvidia-driver目前可行
您在使用哪个操作系统?
Linux
请具体提供设备、版本号等信息。
OS: Arch Linux x86_64 Kernel: Linux 6.16.8-2-cachyos DE: KDE Plasma 6.4.5 WM: KWin (Wayland)
(选填)一些与 Bug 相关的硬件信息。
GPU 1: NVIDIA GeForce RTX 2050 [Discrete] nvidia-utils 580.82.09-3
日志信息
尝试使用nvdec播放时的日志
[kazumi webview parser]: Callback received: [iframe] https://player.moedot.net/player/index.php?code=xfdm1&from=cf&url=https://play.xfvod.pro:8088/M/M-%E5%91%BD%E8%BF%90%E7%9F%B3%E4%B9%8B%E9%97%A8%E7%B3%BB%E5%88%97/%E5%91%BD%E8%BF%90%E7%9F%B3%E4%B9%8B%E9%97%A8/07.mp4
[kazumi webview parser]: Parsing video source https://player.moedot.net/player/index.php?code=xfdm1&from=cf&url=https://play.xfvod.pro:8088/M/M-%25E5%2591%25BD%25E8%25BF%2590%25E7%259F%25B3%25E4%25B9%258B%25E9%2597%25A8%25E7%25B3%25BB%25E5%2588%2597/%25E5%2591%25BD%25E8%25BF%2590%25E7%259F%25B3%25E4%25B9%258B%25E9%2597%25A8/07.mp4
[kazumi webview parser]: Loading video source https://play.xfvod.pro:8088/M/M-%E5%91%BD%E8%BF%90%E7%9F%B3%E4%B9%8B%E9%97%A8%E7%B3%BB%E5%88%97/%E5%91%BD%E8%BF%90%E7%9F%B3%E4%B9%8B%E9%97%A8/07.mp4
media_kit: VideoOutput: video_output_new: 140603615687920
media_kit: VideoOutput: Using S/W rendering.
VideoOutput.Resize
{handle: 140603615687920, id: 94922006819440, rect: {left: 0, top: 0, width: 1, height: 1}}
NativeVideoController: Texture ID: 94922006819440
VideoOutput.Resize
{handle: 140603615687920, id: 94922006819440, rect: {left: 0, top: 0, width: 1920, height: 1080}}
提交前确认
- [x] issue 列表中,没有我发现的这个 Bug
- [x] 我正在使用最新版本的 Kazumi
日志截取截少了,这部分日志没有涉及视频解码,只涉及了视频解析,还有视频渲染
不过硬件渲染也失效了,你将硬件解码开关置于开的位置了吗,这个开关同时是硬件解码和硬件渲染的开关
可否告知从哪能获取硬件解码播放日志?我是直接在shell里打开的就看到这个 开关是开的,就像我说的,使用vaapi是可以使用硬件解码单元的
啊,我好像没有把 libmpv 的内部日志输出到 console
不过你可以在播放视频时右上角,视频详情选项,日志选项卡,那里有只涉及 mpv 的日志
好的,稍等我试试。我不愿意使用vaapi的原因是,如果用vaapi,超分会跑到核显上(即使vaapi调用的是独显),其不足以支持超分。并且我的笔记本不支持独显直连。 如果使用nvdec是否能将超分设备固定到独显上?
我觉得你可能搞反了因果,应该是程序运行在了核显上,所以用不了 NVDEC
你应该考虑通过环境变量或其他手段让程序运行在独显上
实测手动指定n卡启动,但是nvdec仍然无法使用
PlayerLog(prefix: media_kit, level: error, text: error: property not found _setProperty(osc, 1))
PlayerLog(prefix: libmpv_render, level: fatal, text: glGetString(GL_VERSION) returned NULL.)
PlayerLog(prefix: libmpv_render, level: fatal, text: OpenGL not initialized.)
PlayerLog(prefix: playlist, level: warn, text: Reading plaintext playlist.)
PlayerLog(prefix: cplayer, level: info, text: Playing: https://ai.girigirilove.net/zijian/oldanime/2011/04/SteinsGate/01/playlist.m3u8)
PlayerLog(prefix: cplayer, level: info, text: ● Video --vid=1 (h264 1920x1080 23.976 fps))
PlayerLog(prefix: cplayer, level: info, text: ● Audio --aid=1 (aac 2ch 48000 Hz))
PlayerLog(prefix: vd, level: warn, text: Unsupported hwdec: nvdec)
PlayerLog(prefix: cplayer, level: info, text: AO: [pulse] 48000Hz stereo 2ch float)
PlayerLog(prefix: cplayer, level: info, text: VO: [libmpv] 1920x1080 yuv420p)
我好像编译 linux 版本的 mpv 时把 nvdec 裁掉了
在 n 卡启动时超分辨率可以在 n 卡跑吗,不能的话我把 nvdec 加回来
试了vaapi和vdpau都不行,超分还是在核显上跑的
试试 1.8.4 版本的视频播放性能是否符合预期
之前 linux 部分有一个 bug 导致硬件渲染大概率无法启动,也就是上面日志中的
PlayerLog(prefix: libmpv_render, level: fatal, text: glGetString(GL_VERSION) returned NULL.)
PlayerLog(prefix: libmpv_render, level: fatal, text: OpenGL not initialized.)
这是1.8.4版本的日志,相关报错似乎确实消失了
PlayerLog(prefix: media_kit, level: error, text: error: property not found _setProperty(osc, 1))
PlayerLog(prefix: playlist, level: warn, text: Reading plaintext playlist.)
PlayerLog(prefix: cplayer, level: info, text: Playing: https://apn.moedot.net/d/wo/2510/%E9%97%B4%E8%B0%8D01z.mp4)
PlayerLog(prefix: cplayer, level: info, text: ● Video --vid=1 (h264 1920x1080 23.976 fps) [default])
PlayerLog(prefix: cplayer, level: info, text: ● Audio --aid=1 (aac 2ch 44100 Hz 130 kbps) [default])
PlayerLog(prefix: display-tags, level: info, text: File tags:)
PlayerLog(prefix: display-tags, level: info, text: Comment: Sakurato AVPT / BNV: 3.0.13)
PlayerLog(prefix: vd, level: warn, text: Unsupported hwdec: nvdec-copy)
PlayerLog(prefix: cplayer, level: info, text: AO: [pulse] 44100Hz stereo 2ch float)
PlayerLog(prefix: cplayer, level: info, text: VO: [libmpv] 1920x1080 yuv420p)
是的,播放器的硬件加速分为两部分,硬件解码和硬件渲染
openGL 初始化失败会导致无法硬件渲染,这会大大降低性能
在 openGL 可以正确初始化的情况下使用 auto-safe 硬件解码器,即使跑在核显上,程序也应该有更好的性能
不过我的i7-12700H的核显还是吃不上质量档超分,会跑到100%负载且播放卡顿。看来与硬件绝对性能有关。 不过我也不知道用nvdec的话超分能不能顺利跑在独显上就是了。
我的 Linux 测试设备是一台 AMD 笔记本电脑,我无法进行 nvdec 相关测试
这需要其他拥有 Nvidia Linux 设备且对这一问题感兴趣的开发者的帮助
我就是 media-kit 的维护者之一,主分支的 media-kit 默认不显示 playerlog,且依赖系统mpv。你是怎么测试的,还是说你测试的是我的开发分支。
如果使用了硬件解码,在nvtop会显示dec占用。 先入为主以为nvdec用不了就是坏的。后来发现media-kit中使用nvdec-copy能成功硬解,这和kazumi不同。kazumi下nvdec与nvdec-copy都无法使用。 以下是media-kit中使用nvdec-copy播放时的显卡占用截图。
这是测试代码
import 'package:flutter/material.dart';
import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
MediaKit.ensureInitialized();
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late final Player player = Player();
late final VideoController controller = VideoController(
player,
configuration: const VideoControllerConfiguration(
hwdec: "nvdec-copy",
),
);
@override
void initState() {
super.initState();
player.open(
Media('/home/shinka/data/wallpaper.mp4'),
);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'MediaKit NVDEC Demo',
home: Scaffold(
appBar: AppBar(title: const Text('NVDEC 硬件解码测试')),
body: Center(
child: AspectRatio(
aspectRatio: 16 / 9,
child: Video(controller: controller),
),
),
),
);
}
@override
void dispose() {
player.dispose();
super.dispose();
}
}
噢噢,是通过 nvtop 判断的。kazumi 使用的 media-kit 分支是我单独维护的,部分特定会定期同步到上游。
主分支的 media-kit 使用 linux 系统中的 mpv 库,我的分支使用自行编译的 mpv 库,这个库经过很多裁剪,nvdec 的直接支持被裁掉了,因为大部分情况下 vaapi 已经足够。
将 nvdec 加回来其实有些麻烦,主要问题在于我没有 nvdia linux 设备,无法保证 nvdec 正确工作。
一般这种场合的最佳实践是使用 prism之类的工具让整个程序运行在独立显卡上,尝试过类似方法吗。
试过官方的prime-run启动,对超分不起作用,也许应该从别的方向入手。 如果觉得此issue讨论得足够了可以直接关闭。
目前的讨论已经足够,但我会将此 Issue保持开启
当nvdec支持重新加入时我会在这里更新
sudo pacman -S libva-intel-driver libva-utils 如果核显也无法加载,或者什么都加载不了,可以试试这个 intel 的硬件解码 ,还有ui可能有些问题 sudo pacman -S gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav ,这对我起作用了,但我不知道是具体是什么问题。
sudo pacman -S libva-intel-driver libva-utils 如果核显也无法加载,或者什么都加载不了,可以试试这个 intel 的硬件解码 ,还有ui可能有些问题 sudo pacman -S gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav ,这对我起作用了,但我不知道是具体是什么问题。
你没装libva和intel vaapi驱动啊,能加载出来就怪了
@c-xk
尝试这个构建
https://github.com/Predidit/Kazumi/actions/runs/19665314727/artifacts/4671351196
选择 VAAPI 加速,现在支持了直通 VAAPI 而不是 VAAPI-copy
并且有新的多线程视频渲染器和预光栅化的弹幕组件,即使使用的是核显,应该也可以正确流畅地运行效率档超分
感谢提供改进 目前在kazumi1.9.0已经可以使用vaapi直通了(好像之前某个版本支持了),使用效率档超分没有问题。 质量档超分核显还是不行的。