aboutsummaryrefslogtreecommitdiff
path: root/MPVTV/README.md
blob: 12ab1e6a4dd17b6fdaaec5255090ada7bb8a9332 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
使用 t123yh 提供的 IPTV 服务,给家人糊了一个可以观看国内电视的机顶盒,可以用无线键盘控制调台、音量、开关机。实现方式是通过 mpv 播放器 + nvidia-drm 驱动 + nvdec 硬件解码加速,然后用一个 Shell Script 串起来。

视频通过 DRM 直接输出到 N 卡连接的电视,不经过显示服务器。中间经过 nvdec 硬件解码,不使用 CPU。
音频通过 ALSA 直接输出到 HDMI,不经过音频服务器。
调台和其他快捷键通过 mpv 自带的键盘快捷键实现。目前还没有完整实现键盘输入和机顶盒启动的部分。

注意的坑:
1. 在 Cygwin 中,它的 libc 在遇到 printf \n 时会自动输出 CRLF [1](https://github.com/jqlang/jq/issues/92) ,导致 jq(1) 的输出编码错误。因此使用 tr(1) 去除。在 Unix 下可去除这一部分。
2. 使用此法不得设置 fbdev=1 内核参数,否则会导致 dmesg 报错 flip event timeout on head 0 [2](https://forums.developer.nvidia.com/t/545-29-02-fbdev-1-cause-nvidia-drm-flip-event-timeout-on-boot-errors/272829) ,mpv 报错 Failed to commit atomic request: error number 16。
3. 之前 mpv 一直报错 Failed to commit atomic request: error number 22,应该是 Invalid argument,但突然消失了,不知道是哪里没配好。
4. 不正确的分辨率会导致没有输出,mpv(1) 自行选择的分辨率可能并不正确。应当使用 mpv --drm-mode=help 自行选择。
5. 设置 DRM 设备时建议使用 /dev/dri/by-path/ 避免重启导致的 card0 card1 顺序错误,尤其是多显卡的用户。
6. 我还设置了 NVIDIA 内核模块的 early loading 和 nvidia-drm.modeset=1 vt.global_cursor_default=0 modeset=1 这些内核参数,暂时不确定是否有意义。
7. 合理配网,防止卡顿。