群晖入门到进阶系列(四):Video Station 套件

您所在的位置:网站首页 synocommunity社区 群晖入门到进阶系列(四):Video Station 套件

群晖入门到进阶系列(四):Video Station 套件

#群晖入门到进阶系列(四):Video Station 套件 | 来源: 网络整理| 查看: 265

  群晖上对电影等资源的管理方案有很多,自带的 Video Station 作为其官方的套件,相比 Emby/jellyfin、Plex 等第三方的方案,Video Station 胜在简洁易用,DSM 中直接打开视频也是调用的 Video Station 播放,不过我们还是需要对 Video Station 做一些优化(例如对音频编码的支持、电影信息的搜刮等)才能充当我们的电影管理平台。  安装与添加媒体库的过程很简单,直接在“套件中心”查找 Video Station 安装并打开即可,这里不赘述。

音频编码解锁

  最新版的 video station(2.4.7),由于版权问题,锁了 eac3、dts、truehd 等音频编码,因此在播放这些音轨编码的文件时会提示“不支持当前所选音轨的文件格式,因此无法播放视频。请尝试播放其他音轨,确认是否支持”。张大妈 上的这篇文章可以解决这个问题,但是会带来另外一个问题:无法为视频生成缩略图。因为第三方的 ffmpeg 的部分参数与 video station 的 ffmpeg 有些不同。  浣熊窝 大佬的这篇文章很好的解决了这个问题,他的这篇文章更加详细,以下为 Alliot 转摘部分。

添加社区套件源

  如图,打开套件中心,添加套件来源:12名称: SynoCommunity 位置: http://packages.synocommunity.com/

保存即可。2021年10月28日更新DSM 6 版本在添加社区源时出现 “无效的位置”,无法添加成功,参考 can’t add community repo - “invalid location” error 解决:123sudo -imv /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt.bakcurl -Lko /etc/ssl/certs/ca-certificates.crt https://curl.se/ca/cacert.pem

解除屏蔽

套件中心社区源安装最新版的 ffmpeg 后,ssh 连接并群晖获取 root 权限,按顺序执行如下命令:1234567891011121314151617181920212223242526chmod +s /var/packages/ffmpeg/target/bin/ffmpegchmod +s /var/packages/ffmpeg/target/bin/ffprobechmod +s /var/packages/ffmpeg/target/bin/vainfo# 备份sed -i'-BACKUP' -e 's/eac3/ZAAP/' -e 's/dts/ZAP/' -e 's/truehd/ZAPZAP/' /var/packages/VideoStation/target/lib/libsynovte.somv /var/packages/VideoStation/target/bin/ffmpeg /var/packages/VideoStation/target/bin/ffmpeg-BACKUPmv /var/packages/VideoStation/target/bin/ffprobe /var/packages/VideoStation/target/bin/ffprobe-BACKUPmv /var/packages/VideoStation/target/bin/vainfo /var/packages/VideoStation/target/bin/vainfo-BACKUP# 更新/var/packages/VideoStation/target/ffmpeg为自定义脚本,调用第三方的ffmpegecho "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" | base64 -d | gunzip > /var/packages/VideoStation/target/bin/ffmpeg# 更新ffprobe vainfoln -s /var/packages/ffmpeg/target/bin/ffprobe /var/packages/VideoStation/target/bin/ffprobeln -s /var/packages/ffmpeg/target/bin/vainfo /var/packages/VideoStation/target/bin/vainfo# 解除对EAC3 DTS TrueHD的屏蔽sed -i'-BACKUP' -e 's/eac3/ZAAP/' -e 's/dts/ZAP/' -e 's/truehd/ZAPZAP/' /var/packages/VideoStation/target/lib/libsynovte.so# 调整权限信息chmod +x /var/packages/VideoStation/target/bin/ffmpegchmod +s /var/packages/VideoStation/target/bin/ffmpegchown root:VideoStation /var/packages/VideoStation/target/bin/ffmpeg

其中,上文中指的自定义脚本如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365#!/bin/bashrev="12"_log(){ echo "$(date '+%Y-%m-%d %H:%M:%S') - ${streamid} - $1" >> /tmp/ffmpeg.log}_log_para(){ echo "$1" | fold -w 120 | sed "s/^.*$/$(date '+%Y-%m-%d %H:%M:%S') - ${streamid} - = &/" >> /tmp/ffmpeg.log}_term(){ rm /tmp/ffmpeg-${streamid}.stderr _log "*** KILLCHILD ***" kill -TERM "$childpid" 2>/dev/null}trap _term SIGTERMarch=`uname -a | sed 's/.*synology_//' | cut -d '_' -f 1`nas=`uname -a | sed 's/.*synology_//' | cut -d '_' -f 2`pid=$$paramvs=$@stream="${@: -1}"streamid="FFM$pid"bin1=/var/packages/ffmpeg/target/bin/ffmpegbin2=/var/packages/VideoStation/target/bin/ffmpeg-BACKUPargs=()vcodec="KO"while [[ $# -gt 0 ]]docase "$1" in -i) shift movie="$1" args+=("-i" "$1") ;; -hwaccel) shift hwaccel="$1" args+=("-hwaccel" "$1") ;; -scodec) shift scodec="$1" args+=("-scodec" "$1") ;; -f) shift fcodec="$1" args+=("-f" "$1") ;; -map) shift args+=("-map" "$1") idmap=`echo $1 | cut -d : -f 2` if [ "$vcodec" = "KO" ]; then vcodec=`/var/packages/ffmpeg/target/bin/ffprobe -v error -select_streams $idmap -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$movie" | head -n 1` vcodecprofile=`/var/packages/ffmpeg/target/bin/ffprobe -v error -select_streams $idmap -show_entries stream=profile -of default=noprint_wrappers=1:nokey=1 "$movie" | head -n 1` else acodec=`/var/packages/ffmpeg/target/bin/ffprobe -v error -select_streams $idmap -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$movie" | head -n 1` fi ;; *) args+=("$1") ;;esacshiftdone_log "*** PROCESS START REV $rev DS$nas ($arch) PID $pid ***"streamdir=`dirname "$stream"`device=`cat ${streamdir}/video_metadata | jq -r '.device'`_log "DEVICE = $device"_log "MOVIE = $movie"set -- "${args[@]}"argsnew=()args1sv=()args2sv=()args1vs=()args2vs=()while [[ $# -gt 0 ]]docase "$1" in -ss) shift argsnew+=("-ss" "$1") args1sv+=("-ss" "$1") args1sv+=("-noaccurate_seek") args1vs+=("-ss" "$1") args1vs+=("-noaccurate_seek") args2sv+=("-analyzeduration" "10000000") args2vs+=("-analyzeduration" "10000000") ;; -i) shift argsnew+=("-i" "$1") args1sv+=("-i" "$1") args2sv+=("-i" "pipe:0" "-map" "0") args1vs+=("-i" "$1") args2vs+=("-i" "pipe:0" "-map" "0") ;; -vf) shift if [ "$hwaccel" = "vaapi" ] && [ "$vcodecprofile" = "Main 10" ]; then scale_w=`echo "${1}" | sed -e 's/.*=w=//g' | sed -e 's/:h=.*//g'` scale_h=`echo "${1}" | sed -e 's/.*:h=//g'` if let ${scale_w} AND let ${scale_h}; then argsnew+=("-vf" "scale_vaapi=w=${scale_w}:h=${scale_h}:format=nv12,hwupload,setsar=sar=1") else argsnew+=("-vf" "scale_vaapi=format=nv12,hwupload,setsar=sar=1") fi else argsnew+=("-vf" "$1") fi args2sv+=("-vf" "$1") args1vs+=("-vf" "$1") ;; -vcodec) shift argsnew+=("-vcodec" "$1") args1sv+=("-vcodec" "copy") args2sv+=("-vcodec" "$1") args1vs+=("-vcodec" "$1") args2vs+=("-vcodec" "copy") ;; -acodec) shift if [ "$1" = "libfaac" ]; then argsnew+=("-acodec" "aac") args1sv+=("-acodec" "aac") args2vs+=("-acodec" "aac") else argsnew+=("-acodec" "$1") args1sv+=("-acodec" "$1") args2vs+=("-acodec" "$1") fi args2sv+=("-acodec" "copy") args1vs+=("-acodec" "copy") ;; -ab) shift argsnew+=("-ab" "$1") args1sv+=("-ab" "$1") args2vs+=("-ab" "$1") ;; -ac) shift argsnew+=("-ac" "$1") args1sv+=("-ac" "$1") args2vs+=("-ac" "$1") ;; -f) shift argsnew+=("-f" "$1") args1sv+=("-f" "mpegts") args2sv+=("-f" "$1") args1vs+=("-f" "mpegts") args2vs+=("-f" "$1") ;; -segment_format) shift argsnew+=("-segment_format" "$1") args2vs+=("-segment_format" "$1") args2sv+=("-segment_format" "$1") ;; -segment_list_type) shift argsnew+=("-segment_list_type" "$1") args2vs+=("-segment_list_type" "$1") args2sv+=("-segment_list_type" "$1") ;; -hls_seek_time) shift argsnew+=("-hls_seek_time" "$1") args2vs+=("-hls_seek_time" "$1") args2sv+=("-hls_seek_time" "$1") ;; -segment_time) shift argsnew+=("-segment_time" "$1") args2vs+=("-segment_time" "$1") args2sv+=("-segment_time" "$1") ;; -segment_time_delta) shift argsnew+=("-segment_time_delta" "$1") args2vs+=("-segment_time_delta" "$1") args2sv+=("-segment_time_delta" "$1") ;; -segment_start_number) shift argsnew+=("-segment_start_number" "$1") args2vs+=("-segment_start_number" "$1") args2sv+=("-segment_start_number" "$1") ;; -individual_header_trailer) shift argsnew+=("-individual_header_trailer" "$1") args2vs+=("-individual_header_trailer" "$1") args2sv+=("-individual_header_trailer" "$1") ;; -avoid_negative_ts) shift argsnew+=("-avoid_negative_ts" "$1") args2vs+=("-avoid_negative_ts" "$1") args2sv+=("-avoid_negative_ts" "$1") ;; -break_non_keyframes) shift argsnew+=("-break_non_keyframes" "$1") args2vs+=("-break_non_keyframes" "$1") args2sv+=("-break_non_keyframes" "$1") ;; -max_muxing_queue_size) shift args2vs+=("-max_muxing_queue_size" "$1") args2sv+=("-max_muxing_queue_size" "$1") ;; -map) shift argsnew+=("-map" "$1") args1sv+=("-map" "$1") args1vs+=("-map" "$1") ;; *) argsnew+=("$1") if [ "$stream" = "$1" ]; then args1sv+=("-bufsize" "1024k" "pipe:1") args2sv+=("$1") args1vs+=("-bufsize" "1024k" "pipe:1") args2vs+=("$1") else args2sv+=("$1") args1vs+=("$1") fi ;;esacshiftdonesed -i -e "s/{\"PID\":${pid},\"hardware_transcode\":true,/{\"PID\":${pid},\"hardware_transcode\":false,/" /tmp/VideoStation/enabledstartexectime=`date +%s`if [ "$scodec" = "subrip" ]; then _log "FFMPEG = $bin2" _log "CODEC = $scodec" _log "PARAMVS =" _log_para "$paramvs" $bin2 "${args[@]}" &> /tmp/ffmpeg-${streamid}.stderr &elif [ "$fcodec" = "mjpeg" ]; then _log "FFMPEG = $bin2" _log "CODEC = $fcodec" _log "PARAMVS =" _log_para "$paramvs" $bin2 "${args[@]}" &> /tmp/ffmpeg-${streamid}.stderr &else _log "VCODEC = $vcodec ($vcodecprofile)" _log "ACODEC = $acodec" _log "PARAMVS =" _log_para "$paramvs" _log "MODE = WRAP" _log "FFMPEG = $bin1" _log "PARAMWP =" param1=${argsnew[@]} _log_para "$param1" $bin1 "${argsnew[@]}" &> /tmp/ffmpeg-${streamid}.stderr &fichildpid=$!_log "CHILDPID = $childpid"wait $childpidif grep "Conversion failed!" /tmp/ffmpeg-${streamid}.stderr || grep "Error opening filters!" /tmp/ffmpeg-${streamid}.stderr || grep "Unrecognized option" /tmp/ffmpeg-${streamid}.stderr || grep "Invalid data found when processing input" /tmp/ffmpeg-${streamid}.stderr; then _log "*** CHILD END ***" startexectime=`date +%s` _log "STDOUT =" _log_para "`tail -n 15 /tmp/ffmpeg-${streamid}.stderr`" _log "MODE = PIPE SV" _log "FFMPEG1 = $bin1" _log "FFMPEG2 = $bin2" _log "PARAM1 =" param1=${args1sv[@]} _log_para "$param1" _log "PARAM2 =" param2=${args2sv[@]} _log_para "$param2" $bin1 "${args1sv[@]}" | $bin2 "${args2sv[@]}" &> /tmp/ffmpeg-${streamid}.stderr & childpid=$! _log "CHILDPID = $childpid" wait $childpidfiif grep "Conversion failed!" /tmp/ffmpeg-${streamid}.stderr || grep "Error opening filters!" /tmp/ffmpeg-${streamid}.stderr || grep "Unrecognized option" /tmp/ffmpeg-${streamid}.stderr || grep "Invalid data found when processing input" /tmp/ffmpeg-${streamid}.stderr; then _log "*** CHILD END ***" startexectime=`date +%s` _log "STDOUT =" _log_para "`tail -n 15 /tmp/ffmpeg-${streamid}.stderr`" _log "MODE = PIPE VS" _log "FFMPEG1 = $bin2" _log "FFMPEG2 = $bin1" _log "PARAM1 =" param1=${args1vs[@]} _log_para "$param1" _log "PARAM2 =" param2=${args2vs[@]} _log_para "$param2" $bin2 "${args1vs[@]}" | $bin1 "${args2vs[@]}" &> /tmp/ffmpeg-${streamid}.stderr & childpid=$! _log "CHILDPID = $childpid" wait $childpidfiif grep "Conversion failed!" /tmp/ffmpeg-${streamid}.stderr || grep "Error opening filters!" /tmp/ffmpeg-${streamid}.stderr || grep "Unrecognized option" /tmp/ffmpeg-${streamid}.stderr || grep "Invalid data found when processing input" /tmp/ffmpeg-${streamid}.stderr; then _log "*** CHILD END ***" startexectime=`date +%s` _log "STDOUT =" _log_para "`tail -n 15 /tmp/ffmpeg-${streamid}.stderr`" _log "MODE = ORIG" _log "FFMPEG = $bin2" $bin2 "${args[@]}" &> /tmp/ffmpeg-${streamid}.stderr & childpid=$! _log "CHILDPID = $childpid" wait $childpidfistopexectime=`date +%s`if test $((stopexectime-startexectime)) -lt 10; then _log "STDOUT =" _log_para "`tail -n 15 /tmp/ffmpeg-${streamid}.stderr`"fi_log "*** CHILD END ***"_log "*** PROCESS END ***"rm /tmp/ffmpeg-${streamid}.stderr

解决 Video Station 无法正常搜刮问题

  在命名符合规则的正常情况下,Video Station 的影片详情页应该是这样的:电影简介包括字幕等都能够正常搜索与显示,但是,最近天朝和谐了 Video Station 的搜刮器所用的几个 API 网址,因此,我们可以通过修改 hosts 解决这个问题(暂时,最好的办法还是路由器代理):ssh 连接并群晖获取 root 权限,编辑 hosts 文件:12345678910vi /etc/hosts # 按 i 进入编辑模式,添加如下内容: # 搜刮104.16.61.155 image.tmdb.org13.35.67.86 api.themoviedb.org54.192.151.79 www.themoviedb.org13.224.157.34 api.thetvdb.com# 再按 ESC,并切换为大写,按 Z Z 保存

之后,进入 Video Station 重新索引等待搜刮即可。  这里不推荐很多地方推荐的豆瓣、时光等搜刮插件,因为这些插件都是替换 Video Station 自带的默认插件,且类似豆瓣这类反爬比较严格的站点,第三方插件失效的速度可能比 hosts 更改 IP 失效的速度更块。  

安卓客户端无法播放视频

  在公网使用 DS video APP 有出现过无法播放视频的情况,尝试在 DS video APP 的“影片设置”中勾选“通过 HTTP 连接播放视频”,可以解决。 还是无法播放则推荐安装 MX Player 播放器(见 篇一 前言网盘链接)。   

视频无缩略图、无法选择清晰度

  这是黑群晖由于没有洗白的导致的,按照 篇一指引,完成半洗白即可。   

结语

  Video Station 经过上面的完善后,由于其多平台客户端的支持,很适合在内网播放视频(如 DLNA),但是由于其功能过于简单,转码选择过少,无法选择码率等,不是很适合上行小的公网环境使用,因此,Alliot 是 Video Station 配合 Jellyfin 来管理视频库的,关于 Jellyfin 的问题,将在后面的文章讲到。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3