aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MPVTV/README.md14
-rwxr-xr-xMPVTV/tv22
2 files changed, 36 insertions, 0 deletions
diff --git a/MPVTV/README.md b/MPVTV/README.md
new file mode 100644
index 0000000..12ab1e6
--- /dev/null
+++ b/MPVTV/README.md
@@ -0,0 +1,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. 合理配网,防止卡顿。
diff --git a/MPVTV/tv b/MPVTV/tv
new file mode 100755
index 0000000..2987359
--- /dev/null
+++ b/MPVTV/tv
@@ -0,0 +1,22 @@
+#!/bin/sh
+set -e
+echo -e 'q quit\n< playlist-prev\n> playlist-next\nm cycle mute\n/ add volume -2\n* add volume 2' > /dev/shm/input.conf
+(echo "#EXTM3U" && \
+ curl -s https://xxxyyyzzz/channels.json | \
+ jq -rj 'map("#EXTINF:0," + .name + "\nhttps://xxyyzz/watch/" + .addr + "\n") | join("")' | \
+ tr -d '\r') > /dev/shm/playlist.m3u8
+
+mpv \
+ --playlist=/dev/shm/playlist.m3u8 \
+ --input-conf=/dev/shm/input.conf \
+ --fs \
+ --no-osc \
+ --no-config \
+ --no-input-builtin-bindings \
+ --gpu-context=drm \
+ --vo=gpu \
+ --profile=sw-fast \
+ --drm-mode=4096x2160 \
+ --hwdec=nvdec \
+ --drm-device=/dev/dri/by-path/pci-0000:01:00.0-card \
+ --audio-device=alsa/hdmi:CARD=NVidia