找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 650|回复: 9

oect群辉jellyfin10.10.7的docker版页面手势和硬件解码变绿修复

[复制链接]
发表于 2026-1-21 19:39 | 显示全部楼层 |阅读模式
本帖最后由 ColorStripes 于 2026-1-22 16:24 编辑

OECT最近在折腾群辉的jellyfin 我发现手机APP和客户端的页面没有手势功能和硬件解码变绿的问题 操作非常不好用  自行编码jellyfin-web进行功能更新。


硬件解码变绿的问题
不知道什么原因 我试了很多版本 现在latest版本指向的10.11.X版本 这个版本对于RK3566芯片来说解码HDR都变绿  下载了一堆镜像只有10.10.7版本是不变绿的
从官方文件里jellyfin/jellyfin - Docker Image,找到10.10.7的版本,映射好自己的硬件解码目录就可以了。


客户端手势操作
下面以添加状态栏+0.25 x1 -0.25按键为例:

https://github.com/jellyfin/jellyfin-web  下载对应jellyfin版本的源代码,我的是10.10.7。

修改src\controllers\playback\video\index.html
  1.                 <div class="osdTimeText">
  2.                     <span class="endsAtText"></span>
  3.                 </div>
  4.                                 
  5. <!-- 增加代码开始 -->
  6.                 <button is="paper-icon-button-light" class="btnVideoSpeedDec paper-icon-button-light" title="降低 0.25倍速度播放">
  7.                    -&nbsp;0.25&nbsp;X
  8.                 </button>
  9.                                 
  10.                  <button is="paper-icon-button-light" class="btnVideoSpeedDefault paper-icon-button-light" title="正常速度播放">
  11.                    1&nbsp;X
  12.                 </button>
  13.                 <button is="paper-icon-button-light" class="btnVideoSpeedInc paper-icon-button-light" title="增加 0.25倍速度播放">
  14.                    +&nbsp;0.25&nbsp;X
  15.                 </button>

  16. <!-- 增加代码结束 -->
  17.                 <button is="emby-ratingbutton" type="button" class="btnUserRating hide autoSize paper-icon-button-light" title="${Rate}">
  18.                     <span class="xlargePaperIconButton material-icons favorite" aria-hidden="true"></span>
  19.                 </button>
复制代码

绑定按钮事件: src\controllers\playback\video\index.js

  1. // 顶部增加弹出提示的引用--------------------------
  2. import toast from '../../../components/toast/toast';




  3.     view.querySelector('.btnVideoOsdSettings').addEventListener('click', onSettingsButtonClick);

  4. // 增加代码开始
  5.     view.querySelector('.btnVideoSpeedDec').addEventListener('click', onVideoSpeedDec);
  6.     view.querySelector('.btnVideoSpeedDefault').addEventListener('click', onVideoSpeedDefault);
  7.     view.querySelector('.btnVideoSpeedInc').addEventListener('click', onVideoSpeedInc);
  8.         
  9.     const container = document.querySelector('#videoOsdPage');
  10.     //增加触摸,鼠标按下+2倍数
  11.     container.addEventListener('mousedown', onVideoSpeedDec2);   //鼠标按下
  12.     container.addEventListener('touchstart', onVideoSpeedDec2);   //手指触摸屏幕
  13.    
  14.     //增加触摸,鼠标松开恢复
  15.     container.addEventListener('mouseup', onVideoSpeedDec1Default);  //鼠标松开
  16.     container.addEventListener('touchend', onVideoSpeedDec1Default);  //手指离开屏幕


  17. // 增加代码结束
  18.         
  19.     view.addEventListener('viewhide', function () {
  20.         headerElement.classList.remove('hide');
  21.     });



  22. // 增加事件函数--------------------------

  23.     function nowPlayingDurationTextClick()
  24.       ·············
  25.     }

  26. //增加代码开始

  27.     // 播放速度降低 0.25
  28.     function onVideoSpeedDec() {
  29.         const video = document.querySelector('video');
  30.         if (!video) return;
  31.    
  32.         let currentSpeed = video.playbackRate;  // 读取当前速度
  33.         currentSpeed -= 0.25;
  34.         currentSpeed = Math.max(0.25, currentSpeed);        // 限制最小速度,比如不低于 0.25
  35.         video.playbackRate = currentSpeed;  // 应用新速度
  36.         toast(`${globalize.translate('PlaybackRate')}: ${currentSpeed.toFixed(2)} 倍`);
  37.     }
  38.    
  39.     // 恢复正常速度(1x)
  40.     function onVideoSpeedDefault() {
  41.         const video = document.querySelector('video');
  42.         if (!video) return;
  43.         video.playbackRate = 1.0;  
  44.         toast(`${globalize.translate('PlaybackRate')}: 1 倍`);
  45.     }
  46.    
  47.     // 播放速度增加 0.25
  48.     function onVideoSpeedInc() {
  49.         const video = document.querySelector('video');
  50.         if (!video) return;
  51.    
  52.         let currentSpeed = video.playbackRate;
  53.         currentSpeed += 0.25;

  54.         currentSpeed = Math.min(10.0, currentSpeed);        // 限制最大速度
  55.         video.playbackRate = currentSpeed;
  56.                 toast(`${globalize.translate('PlaybackRate')}: ${currentSpeed.toFixed(2)} 倍`);
  57.     }
  58.         

  59.         
  60.     let bfSpeed=1;    //当前播放速度
  61.     let speedHoldTimer = null; // 存储 setTimeout 的句柄
  62.     let isSpeedApplied = false; // 标记是否已经应用了倍速
  63.     // 播放速度+2倍速度
  64.     function onVideoSpeedDec2(e) {
  65.             const video = document.querySelector('video');
  66.         if (!video) return;
  67.                 if (video.paused) return; //暂停状态不触发
  68.                 if (e.target.closest('.videoOsdBottom')) return;  // 点击底部状态栏的元素,不触发

  69.                 // 清除之前的定时器
  70.                 if (speedHoldTimer) {
  71.                     clearTimeout(speedHoldTimer);
  72.                     speedHoldTimer = null;
  73.                 }
  74.                 isSpeedApplied = false;
  75.                 bfSpeed=video.playbackRate;  //记录一下之前的播放速度
  76.                
  77.                 // 设置 500ms 后触发倍速
  78.                 speedHoldTimer = setTimeout(() => {
  79.             const newSpeed = bfSpeed + 2;
  80.             video.playbackRate = newSpeed;
  81.             isSpeedApplied = true;
  82.             toast(`${globalize.translate('PlaybackRate')}: ${newSpeed.toFixed(2)} 倍`);
  83.                 }, 500);
  84.                
  85.     }
  86.    
  87.          // 播放速度+2倍速度 恢复之前的速度
  88.     function onVideoSpeedDec2Default(e) {
  89.             const video = document.querySelector('video');
  90.         if (!video) return;
  91.                 if (video.paused) return;
  92.                 if (e.target.closest('.videoOsdBottom')) return;

  93.                 // 清除定时器,防止松开后延迟触发
  94.                 if (speedHoldTimer) {
  95.                     clearTimeout(speedHoldTimer);
  96.                     speedHoldTimer = null;
  97.                 }

  98.                 // 只有在已经应用了倍速的情况下才恢复
  99.                 if (isSpeedApplied) {
  100.                     video.playbackRate = bfSpeed;
  101.                     toast(`${globalize.translate('PlaybackRate')}: ${bfSpeed.toFixed(2)} 倍`);
  102.                 }
  103.                
  104.                 // 重置状态
  105.                 isSpeedApplied = false;

  106.     }

  107. //增加代码结束
  108.     function onSettingsButtonClick()
复制代码
手动编译源码
在jellyfin-web10.10.7/jellyfin10.10.7文件夹下面运行,我下载的时候是有魔法网络
  1. export http_proxy=http://127.0.0.1:7890
  2. export https_proxy=http://127.0.0.1:7890
  3. npm install --registry=https://registry.npmmirror.com
  4. npm run build:production
复制代码




docker设置:
修改自己的映射目录 - /volume1/docker/jellyfin/jellyfin-web:/jellyfin/jellyfin-web这个目录必须要有,然后将刚刚编译的文件放到你映射的目录里jellyfin-web里,启动docker就可以了

  1. version: '3.5'

  2. services:
  3.   jellyfinny:
  4.     image: jellyfin/jellyfin:10.10.7

  5.     container_name: jellyfin
  6.     privileged: true
  7.     ports:
  8.       - "8098:8096"
  9.     volumes:
  10.       - /volume1/docker/jellyfin/config:/config
  11.       - /volume1/docker/jellyfin/cache:/cache
  12.       - /volume1/docker/jellyfin/tmp:/tmp
  13.       - /volume1/docker/jellyfin/jellyfin-web:/jellyfin/jellyfin-web
  14.       - /volumeUSB2/usbshare:/usb2
  15.       - /volumeUSB3/usbshare:/usb3
  16.       - /volumeUSB4/usbshare:/usb4
  17.       - /volumeUSB5/usbshare:/usb5
  18.       - /volumeUSB6/usbshare:/usb6


  19.     devices:
  20.       - /dev/dri:/dev/dri
  21.       - /dev/dma_heap:/dev/dma_heap
  22.       - /dev/mali0:/dev/mali0
  23.       - /dev/rga:/dev/rga
  24.       - /dev/mpp_service:/dev/mpp_service
  25.       - /dev/iep:/dev/iep
  26.       - /dev/mpp-service:/dev/mpp-service
  27.       - /dev/vpu_service:/dev/vpu_service
  28.       - /dev/vpu-service:/dev/vpu-service
  29.       - /dev/hevc_service:/dev/hevc_service
  30.       - /dev/hevc-service:/dev/hevc-service
  31.       - /dev/rkvdec:/dev/rkvdec
  32.       - /dev/rkvenc:/dev/rkvenc
  33.       - /dev/vepu:/dev/vepu
  34.       - /dev/h265e:/dev/h265e


  35.     restart: unless-stopped
复制代码
如果的源码不会修改:

可以用我修改好的附件,替换src\controllers\playback\video\index.html src\controllers\playback\video\index.js ,然后编译

首先我的代码 功能:

1.左右滑动屏幕调整进度,只显示进度条(预览图不会消失,需要点两下屏幕收回状态栏就可以消失)
2.右边调整音量,但手机内核实际音量未变(可能是系统原因)
3.左边滑动调整亮度
4.长按屏幕四倍加速
5.双击暂停播放
6.进度图变成B站小电视,还有拖动进度条眼睛朝向拖动方向,点击眼睛变成竖线动画

运行效果图片可以看下面

本人非CSS专业方向,欢迎各位根据代码自行修改,也欢迎提出宝贵的意见修复1和2里的bug问题或提供文件。
感谢Gemini pro大学生特供版提供的代码帮助

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1恩山币 +1 收起 理由
qms998 + 1 呐,做人呢,最重要的就是开心 ...

查看全部评分

只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
发表于 2026-1-21 21:06 | 显示全部楼层
今天为什么没有更新包

点评

需要什么更新包呢 我的更新就结束了  详情 回复 发表于 2026-1-22 16:20
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-1-22 15:15 | 显示全部楼层
非docker版jellyfin基本上转码是废的,还找不到不解码的选项,有知道的请告知,经常卡死,弄起来很恼火
只有映射网络硬盘直接播放,不卡

点评

启动管理员权限 并且在套件映射目录里面添加 环境变量目录 devices: - /dev/dri:/dev/dri - /dev/dma_heap:/dev/dma_heap - /dev/mali0:/dev/mali0 - /dev/rga:/dev/rga - /dev/mpp_s  详情 回复 发表于 2026-1-22 16:22
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-1-22 16:07 | 显示全部楼层
谢谢分享技术贴,原来解码变绿是jellyfin版本的问题
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2026-1-22 16:20 | 显示全部楼层
xcgf 发表于 2026-1-21 21:06
今天为什么没有更新包

需要什么更新包呢 我的更新就结束了
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2026-1-22 16:22 | 显示全部楼层
bird202301 发表于 2026-1-22 15:15
非docker版jellyfin基本上转码是废的,还找不到不解码的选项,有知道的请告知,经常卡死,弄起来很恼火
只 ...

启动管理员权限 并且在套件映射目录里面添加 环境变量目录
devices:
      - /dev/dri:/dev/dri
      - /dev/dma_heap:/dev/dma_heap
      - /dev/mali0:/dev/mali0
      - /dev/rga:/dev/rga
      - /dev/mpp_service:/dev/mpp_service
      - /dev/iep:/dev/iep
      - /dev/mpp-service:/dev/mpp-service
      - /dev/vpu_service:/dev/vpu_service
      - /dev/vpu-service:/dev/vpu-service
      - /dev/hevc_service:/dev/hevc_service
      - /dev/hevc-service:/dev/hevc-service
      - /dev/rkvdec:/dev/rkvdec
      - /dev/rkvenc:/dev/rkvenc
      - /dev/vepu:/dev/vepu
      - /dev/h265e:/dev/h265e

点评

谢谢您,我试试  详情 回复 发表于 2026-1-22 19:21
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-1-22 19:21 | 显示全部楼层
ColorStripes 发表于 2026-1-22 16:22
启动管理员权限 并且在套件映射目录里面添加 环境变量目录
devices:
      - /dev/dri:/dev/dri

谢谢您,我试试
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-1-23 10:49 | 显示全部楼层
这内容什么意思 看不明白
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-1-26 14:18 | 显示全部楼层
用nyanmisaka/jellyfin这个好像可以直接转码,我用的就是这个

点评

HDR变绿那个解决不了  详情 回复 发表于 2026-1-26 22:59
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2026-1-26 22:59 | 显示全部楼层
sichaozhi 发表于 2026-1-26 14:18
用nyanmisaka/jellyfin这个好像可以直接转码,我用的就是这个

HDR变绿那个解决不了
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /2 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2026-8-23 22:39

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 电话:13506125623

快速回复 返回顶部 返回列表