From d1c3cdc9e61de92cfdb2b1ca0d9e7da9b1b80a6a Mon Sep 17 00:00:00 2001 From: Yuuta Liang Date: Tue, 21 Nov 2023 17:15:54 -0800 Subject: Add MPV TV --- MPVTV/README.md | 14 ++++++++++++++ MPVTV/tv | 22 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 MPVTV/README.md create mode 100755 MPVTV/tv 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 -- cgit v1.2.3