自建高解析度影音串流平台

2023-01-11 (Updated 2023-01-22)

最近折腾openwrt,给子设备开启了公网ipv6地址,同时自己的hi-res影音库也开始积攒空间,不能简单地再用syncthing同步到所有设备上了。于是开始想办法用网络串流自己的文件。写篇blog简单记录下我的方法,说不定能帮到和我有一样想法的你。

Part 0: 替代方式

以下是在开工前我想到的部分替代方式和为什么不使用他们的原因:

Part 1: 把文件放到局域网上

软件

首先找了个移动硬盘, 用btrfs格式化, 开启lzo压缩, 顺便用luks加密, 然后把文件都丢进去. (当然用ext4 / vfat也行)

然后就是把文件托管在局域网里的服务器上, 这里我用的是运行archlinux arm的树莓派,因为可以24小时在线,而且节能.

托管的这一步很简单, 主要考虑的是协议:

最后选择的是SAMBA, 服务端和客户端的兼容性都好, 有用户认证权限管理和加密.

pacman -Syu samba

按照样例文件和wiki更改配置, 用testparm测试配置文件, 最后去systemd开启smb

systemctl enable --now smb

防火墙

如果安了ufw防火墙还要允许smb的端口

ufw enable 139
ufw enable 445
ufw reload

Extra: 开启局域网公告(avahi zeroconf)

也是按照wiki,安一个avahi,然后运行.

安了zeroconf的好处是不用手动输地址

pacman -Syu avahi
systemctl enable --now avahi

现在已经可以用vlc在局域网上找到smb服务器了.

Part 2: 用ipv6开启外网访问

现在局域网上的设备都能访问我的这些文件, 但是出门用流量联网之后就不行了. 这个问题的解决方法也很简单, 开启samba的ipv6监听, 配置路由器的防火墙(如果有的话).

前提条件: 有公网ipv6

首先看下自己有没有公网ipv6:

user@host ~ $ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: end0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 2****:****:****:****::****/128 scope global dynamic noprefixroute
       valid_lft *****sec preferred_lft *****sec
    inet6 2***:****:****:****:****:****:****:****/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft *****sec preferred_lft *****sec
    inet6 fe80::****:****:****:****/64 scope link
       valid_lft forever preferred_lft forever

动态dns

找一家动态dns服务商. 我用的duckdns, 因为可以不注册帐号直接用github登录, 配置简单且免费.

在samba服务器上安装ddns脚本, 修改配置并启动(也可以自己写), wiki上有教程, 此处不赘述.

等10分钟左右去解析一下自己的域名, 能解析到自己的ipv6地址就成功了, 成功示例:

user@host ~ $ nslookup your-domain.duckdns.org
Server:  192.168.1.1
Address: 192.168.1.1#53

Non-authoritative answer:
Name: your-domain.duckdns.org
Address: 2***:****:****:****:****:****:****:****

修改配置

首先去改samba的设置, 然后重启系统服务.

# /etc/samba/smb.conf
# 仅展示核心配置, 根据情况修改, 不要直接复制粘贴
[global]
interfaces = ::/0 192.168.1.0/24
hosts allow = 192.168.1. ::/0
systemctl restart smb

现在已经可以在公网访问smb了, linux可以用cifs挂载:

doas mount -t cifs //your.domain.com/share /your/mountpoint -o username=*****,password='*****',uid=*****,gid=*****

也可以用smbclient,此处不赘述.

Extra: 安卓端软件配置

在写本文章的时候(2023-1-11, VLC android 3.5.3), vlc有两个相关的bug:

解决ipv6 samba连接问题

Settings -> Advanced -> Prefer SMB 1, 把这个关掉, 然后点Clear media database就可以了. 其他的都不用动.

为公网samba网盘建立索引

目前VLC还在开发这项功能, 暂时无法实现.

更新:参见我的下一篇文章