ReadyMedia

来自 ArchWiki

ReadyMedia (之前称为 MiniDLNA) 是一款服务器软件,旨在完全兼容 DLNA/UPnP 客户端。MiniDLNA 守护程序向网络上的客户端提供媒体文件(音乐、图片和视频)。客户端示例包括 totemKodi 等应用程序,以及便携式媒体播放器、智能手机、电视和游戏机等设备。

ReadyMedia 是 Gerbera 的一个简单、轻量级的替代品,但功能较少。它没有用于管理的 Web 界面,必须通过编辑文本文件进行配置。

安装

安装 minidlna 软件包。

如果您想使用支持转码的非官方分支,请安装 readymedia-transcode-gitAUR 软件包。

配置和启动

警告: 当前版本的 ReadyMedia 存在一个严重的错误:用于绑定到特定 IP 地址的 -i 命令行选项和 network_interface 配置选项不适用于 HTTP 服务器。该错误已于 2017 年报告给 上游。Web 服务器在所有接口上仍然可访问,如果在公共可访问的主机上运行,可能会造成安全问题。

默认情况下,minidlna 作为系统服务运行(或者,您可以手动运行)。它可以在 /etc/minidlna.conf 中配置。设置以下必要的设置

/etc/minidlna.conf
#network_interface=eth0                         # Self-discovers if commented (at times necessary to set)
media_dir=A,/home/user/Music                    # Mounted Media_Collection drive directories
media_dir=P,/home/user/Pictures                 # Use A, P, and V to restrict media 'type' in directory
media_dir=V,/home/user/Videos
friendly_name=Media Server                      # Optional
inotify=yes                                     # 'no' for less resources, restart required for new media
presentation_url=http://www.mylan/index.php     # or use your device static IP http://192.168.0.14:8200/

MiniDLNA 默认以 minidlna 用户身份运行。要更改其运行用户,请参阅下面的 #以您自己的用户身份运行 minidlna

minidlna 服务可以通过 minidlna.service 使用 systemd 进行管理。

自动 Media_DB 更新

内核在 /etc/minidlna.conf 中设置的 Media_Collection 目录中,为每个文件夹/子文件夹添加一个 inotify 监视器,以监控更改,从而允许 MiniDLNA 实时更新 Media_DB。当 MiniDLNA 以普通用户身份运行时,它没有能力更改内核的 inotify 限制。如果默认的 inotify 监视器数量不足以让 MiniDLNA 监控所有媒体文件夹,请通过 sysctl 增加 inotify 监视器(100000 对于大多数用途应该足够了)

# sysctl fs.inotify.max_user_watches=100000

要使其永久更改,请添加到 /etc/sysctl.d/90-inotify.conf

# Increase inotify max watchs per user for local minidlna
fs.inotify.max_user_watches = 100000

inotify 性能可能取决于设备类型。有些设备不会持续或根本不重新扫描媒体驱动器。如果在受监控的媒体目录中添加/删除文件,可能要等到设备 DLNA 客户端重启后才会注意到。

通过比较文件计数来检查 MiniDLNA presentation_urlinotify 更新。如果计数没有变化,请确保运行 MiniDLNA 的用户对 DB 文件夹具有 rw 访问权限。如果问题仍然存在,请先将新文件复制或下载到同一驱动器上未被 inotify 监视的 Downloads 文件夹,然后再将它们移动到相应的媒体文件夹,因为长时间的媒体文件复制或下载可能会使 inotify 感到困惑。

您也可以在停止 MiniDLNA 守护程序后手动清理或重建 MiniDLNA DB,或分析其调试输出(Ctrl+C 退出)

本文或章节已过时。

原因: 自从 minidlna 1.3.0-2 删除了临时的 minidlna 用户以来,这就不起作用了。(导致:minidlna.c:782: fatal: Bad user 'minidlna'.)(在 Talk:ReadyMedia 中讨论)

停止 MiniDLNA 守护程序。

强制重建 Media_DB

# minidlnad -R

重建 Media_DB 后停止守护程序,例如 killall minidlnad

以调试模式运行

# minidlnad -d

Ctrl+C 退出。

解决服务自动启动问题

有时 minidlna 守护程序在启动时无法启动。NetworkManager#NetworkManager-wait-online 解决了这个问题。请参阅 FS#35325

以您自己的用户身份运行 minidlna

更改 /etc/minidlna.conf 中的 user 行,并将 db_dirlog_dir 选项更改为该用户可写的目录。如果您不使用 systemd 运行,则只需执行此操作。

如果您正在使用 systemd 服务,请编辑 minidlna.service,因为它默认将以 minidlna 用户身份运行。为此,创建一个 /etc/systemd/system/minidlna.service.d/run-as-user.conf drop-in 文件

/etc/systemd/system/minidlna.service.d/run-as-user.conf
[Service]
User=user
Group=group
注意
  • 如果您希望 minidlna 能够读取/写入 /home/user/,包括 db_dir 或任何 media_dir,请在 [Service] 部分添加 ProtectHome=offDynamicUser=no
  • systemd 服务不使用 log_dir。相反,以 root 身份运行 journalctl -u minidlna.service 以查看日志。

/usr/lib/tmpfiles.d/minidlna.conf 文件复制到 /etc/tmpfiles.d/minidlna.conf,并将 root 替换为您自己的用户和组

不使用 systemd 运行 minidlnad

除了系统服务之外,您还可以手动运行 minidlna。如果您想共享媒体但没有机器的管理员访问权限,这可能很有用。

在本地创建必要的文件和目录并编辑配置

$ install -Dm644 /etc/minidlna.conf ~/.config/minidlna/minidlna.conf
$ $EDITOR minidlna.conf

配置应如上所述,特别是

media_dir=/home/$USER/dir
db_dir=/home/$USER/.cache/minidlna
log_dir=/home/$USER/.config/minidlna

您现在可以使用以下命令启动 minidlna

$ minidlnad -f /home/$USER/.config/minidlna/minidlna.conf -P /home/$USER/.config/minidlna/minidlna.pid

要在登录时自动启动它,请将上一行添加到 ~/.bash_profile

其他方面

可能需要预先考虑其他方面和 MiniDLNA 的限制,以确保对其性能感到满意。

防火墙

如果使用防火墙,则需要打开 ssdp (1900/udp) 和 trivnet1 (8200/tcp) 端口。例如,可以使用 arno 的 iptables 防火墙来完成此操作,方法是编辑 firewall.conf 并通过执行以下操作来打开端口

firewall.conf
OPEN_TCP="8200"
OPEN_UDP="1900"

iptables

除了 1900/udp 和 8200/tcp 之外,minidlna 可能还需要允许组播。因此,iptables 的整体配置可能如下所示,假设有单独的链处理 TCP、UDP 和 IGMP。

 -A TCP -m tcp --dport 8200 -m comment --comment minidlna -j ACCEPT
 -A UDP -d 239.255.255.250/32 -m udp --dport 1900 -m comment --comment "upnp dlna" -j ACCEPT
 -A IGMP -d 224.0.0.1/32 -m comment --comment "igmp membership queries, upnp/dlna" -j ACCEPT
 -A IGMP -d 239.0.0.0/8 -m comment --comment "igmp multicast, upnp/dlna" -j ACCEPT

文件系统和本地化

当在 Linux 和 Windows 中都可访问的外部驱动器上保存 MiniDLNA Media_DB 时,请为其选择合适的文件系统NTFS 在 Windows 中保留其 Linux 默认设置:root 用户的 rw 访问权限和文件名的 UTF8 字体编码,因此当在终端和媒体播放器中浏览 Media_DB 时,您语言的媒体标题是可读的,因为大多数都支持 UTF8。如果您更喜欢 Vfat (FAT32) 以获得更好的 USB 驱动器与直接连接时的旧播放器的兼容性,或者您的 Media_Collection 驱动器是 Vfat 并且具有您本地语言的文件夹和文件名,则 MiniDLNA 可以在扫描文件夹到 Media_DB 时将它们转码为 UTF8 字符集。将您的 FS 语言 代码页 添加到 Media_CollectionMedia_DB 驱动器的挂载选项中,以便转码为短 DOS 文件名,并将 iocharset 用于将长文件名转换为终端的区域设置,例如 codepage=cp866,iocharset=utf8 (或 ISO-8859-5)。为所有用户设置 rw 权限,因为 Vfat 不会保留 Linux 访问权限

UUID=6140-75F7 /media/MyDrive/Media_DB vfat user,rw,async,noatime,umask=111,dmask=000,codepage=cp866,iocharset=utf8 0 0

虽然您的 iocharset 将存在于具有匹配区域设置的系统中,但如果您的终端或播放器仅支持短文件名,请检查设置的 codepage 是否也存在并已启用(如 ru_RU.CP866),即在编译 Arch Linux 版本时是否包含在系统配置中,或者考虑重新编译该版本以添加它

ls /usr/share/fonts/encodings

MiniDLNA 在其 DB 中按文件名列出 电影照片,并按 ID3 标签 而不是文件名列出 音乐 条目。如果音乐收藏未使用 UTF8 标记,而是使用本地字符集标记,则 MiniDLNA 可能无法正确识别并将其转码为 UTF8 以在媒体播放器中显示,或者您的系统中可能缺少原始标签 codepage(s),因此即使媒体文件名可读,标签也可能不可读。在这种情况下,请考虑使用 ID3 标签转换器 将您的收藏重新标记为 UTF-16BEUTF-8 编码。

为您的 Media_Collection 选择“正确”的文件系统 是一种权衡:XFS 和 EXT4 显示 HD 的快速读/写以及较低的 CPU 负载,这对于连接存储的慢速计算机至关重要。NTFS 与 Windows 最兼容,当直接插入驱动器以进行更快的复制时,而 Samba、NFS 或 iSCSI 等网络文件系统允许将任何 Linux FS 导入到 Windows,但数据复制速度较慢。由于文件碎片会影响播放,因此请将您的电影存储在格式化为 XFS(防止碎片)、NTFS(抗碎片且易于碎片整理)或 EXT4(使用大文件区段)的非系统驱动器上,并避免 EXT3 或 不太 抗碎片的 FAT32。对于较小的闪存驱动器,其中很少有碎片化的音乐和照片文件,VFAT (FAT32) 和 EXT4 显示更快的写入速度和更低的 CPU 负载,但 EXT4 可能会因日志记录而影响内存磨损,并且与媒体播放器的兼容性较差。正确的驱动器分区、块对齐挂载选项(即 async,noatime...- 选择取决于文件系统和内存类型)可以极大地加速闪存和 HD 驱动器的速度以及其他优势

媒体处理

MiniDLNA 旨在用于小型设备,因此不会生成电影缩略图以降低 CPU 负载和 DB 构建时间。它使用与电影在同一文件夹中的缩略图(如果有),或者从媒体容器(如 MP4 或 MKV)中提取缩略图(如果存在嵌入的专辑封面标签),但不适用于 AVI。可以使用 缩略图制作器 将缩略图(JPG 160x160 像素或更小)添加到媒体文件夹,MiniDLNA 将在重新扫描后将它们链接到媒体文件。较大的缩略图将被调整大小并存储在 Media_DB 中,这会减慢扫描速度。在每个文件夹一个电影的情况下,请遵循 minidlna.conf 中的缩略图命名规则。对于每个文件夹多个剧集的情况,每个缩略图名称应与其剧集名称匹配,不带扩展名(<file>.cover.jpg<file>.jpg)。要处理带有 GUID 的 MS 专辑封面 缩略图名称,请在末尾添加 * "AlbumArt_{*".jpg 。MiniDLNA 将仅在屏幕上列出选定的媒体类型(即电影),而不会列出同一文件夹中的其他文件。

查看照片时,您的播放器可能不支持通过 DLNA 查看渐进式和/或无损压缩 JPG。此外,请根据播放器的文档将照片大小调整为“建议的照片大小”,以实现无问题的图像幻灯片放映。DLNA 规范将图像类型限制为 JPG 或 PNG,最大尺寸为 4096 x 4096 像素 - 这仅在 DLNA 服务器实现支持 LARGE 格式的情况下才成立。下一个尺寸限制(MEDIUM)是 1024 x 768,因此调整大小可能有助于正确显示照片。

为了降低系统负载,MiniDLNA 不会在运行时将不受支持的媒体文件转码为您的播放器支持的格式。在构建 Media_DB 时,它可能无法正确识别您的播放器是否支持某些格式,而您的播放器可能通过 UPnP 播放更广泛的格式选择。DLNA 标准在媒体容器和允许的编解码器配置文件中相当有限的 UPnP 子集。如果您在电视屏幕上看不到或无法播放 Media_DB 中列出的某些媒体文件,请检查您的硬盘是否开始旋转,或者尝试通过 USB 连接到您的媒体播放器进行播放。MiniDLNA 可能不支持为您的播放器型号选择音轨、字幕、章节、列表排序和其他高级播放功能。

构建媒体服务器

提供的媒体可以基于轻量级且廉价的系统,如开发板(Raspberry Pi、CubeBoard 等)。您甚至不需要在此板上安装 X Server。

自动挂载外部驱动器

如果您想自动化服务器,这将非常有用。有关更多信息,请参阅 udisks#Mount helpers

问题

基于 MiniDLNA 的媒体服务器可能会遇到驱动器重新扫描问题。例如:您插入的外部 HDD 每次都会一遍又一遍地扫描。发生这种情况是因为 MiniDLNA 删除了未插拔驱动器的 DB 记录。如果您的驱动器一直插着,这不是问题,但如果您在大型外部驱动器上有“可插拔”媒体库,则这可能需要很长时间才能开始观看视频。

可以使用 这个 minidlna 分支 来解决重新扫描问题。它在每个视频文件旁边创建一个元数据文件。这可以显着减少大型媒体的扫描时间。

故障排除

服务器在无线网络中不可见

组播请求有时在无线网络中受到限制。因此,minidlna 服务器将看不到 239.255.255.250:1900 ssdp:discover 客户端的请求,并且不会显示出来。要解决此问题,请在路由器上禁用“组播隔离”和/或“组播到单播”。示例

  • 在 ADB / Pirelli P.RG EA4202N 路由器上,连接到配置页面,然后选择设置->桥接和 VLAN->桥接列表->单击桥接以太网 WiFi 上的编辑->将组播隔离设置为否->应用
  • Upvell 路由器:无线 > 高级设置 > 组播到单播 > 已禁用,组播速率“自动”

媒体目录不可访问

请注意,默认的 systemd 服务文件强制执行参数 ProtectHome=on。如果您打算共享位于 /home/ 文件系统中的文件,您可能需要放宽此限制。您可以通过更新 systemd 单元覆盖文件来实现此目的。

/etc/systemd/system/minidlna.service.d/override.conf
[Service]
ProtectHome=read-only

在桥接设备上共享时,DLNA 服务器在一段时间后停止可见

如果您使用 ReadyMedia 在桥接设备(例如桥接到以太网设备的 OpenVPN 设备)上“广播”,则服务器可能会在一段时间后(从几秒钟到半天不等)停止被客户端看到。为了解决这个问题,您需要禁用“多播侦听”。您可以使用以下命令立即执行此操作

# echo 0 >> /sys/devices/virtual/net/br0/bridge/multicast_snooping

这应该使服务器*立即*对客户端可见,但更改将在重新启动时丢失。如果这有效,您可以使用 systemd 服务文件使其成为永久更改。使用以下内容编辑文件 /etc/systemd/system/multicast_snooping.service

[Unit]
Description=Set multicast snoop to off
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c "echo 0 >> /sys/devices/virtual/net/br0/bridge/multicast_snooping"
RemainAfterExit=true
ExecStop=/usr/bin/bash -c "echo 1 >> /sys/devices/virtual/net/br0/bridge/multicast_snooping"
StandardOutput=journal

[Install]
WantedBy=multi-user.target

现在您要做的就是启用 multicast_snooping.service

此方法应在每次启动时禁用多播侦听。