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

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

#FOSS #Software #Networking #linux

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还在开发这项功能, 暂时无法实现.

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



Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

We can't live, work or learn in freedom unless the software we use is free.

Arguing that you don't care about the right to privacy because you have nothing to hide is no different from saying you don't care about free speech because you have nothing to say. – Edward Snowden