最近在研究流媒体服务器,想实现无论是在客厅还是卧室、无论是躺着还是坐着都可以快乐追番,首先微软自带的windows media player很好用,基本上电视都支持dlna,同一局域网就可以远程播放多媒体文件,而平板、手机上都是有相关app支持dlna的,我个人实验下来还不错的移动端app如下:
1 2 iOS: infuseAndroid : VLC (或者 BubbleUPnP + MXplayer)
再者大多播放器也支持smb协议,可以用电脑来共享文件。也就是说,只要有一台24h运行、设置好相关服务的电脑,就可以满足我的需求。
但全天开着电脑,很不环保,完全可以用树莓派来替代。(今天实战了一下,播放1080P视频非常流畅,包括拖动进度条、切换视频等)
有网友很好奇,怎么弄?成本是多少?那我就把搭建材料、过程都分享出来。
材料 1 2 3 4 1 T 移动硬盘:¥399 (京东西数自营店价格。可以买一块2 T 的机械硬盘+硬盘盒,价格和这差不多) 树莓派4 b: ¥579 (淘宝某店4 G主板基础套餐价格,带TF卡、读卡器、micro-HDMI线等配件) P.S.后面了解到一些入门的nas好像也就不到一千块,如果你不想折腾其实完全可以直接买一个真正的nas。
以上两个东西是我很早之前就买了,一直在吃灰,今天才拿出来废物利用使用。价格也是现查的,之前买的时候貌似比这还便宜吧。。。
所以只要有一个硬盘(支持usb3.0),有一块树莓派4b的板子(我的是4G内存,你也可以用性能更好的8G),就可以开始制作了。
其他需要的一些东东:
一台电脑(我只有windows,后面都用windows举例)
一个路由器(电脑、树莓派都接入该路由器的wifi)
TF卡,不用太大,16G就可以了,拿来做树莓派系统绰绰有余
读卡器
键盘、鼠标、micro-HDMI线 、显示器(接树莓派,做输入输出)
装系统 树莓派官网下载地址: Raspberry Pi Imager
选择自己电脑对应的系统版本下载就好了,我这里下载的是windows版的Raspberry Pi Imager。
拿出TF卡,使用读卡器插到电脑上,如下图,依次选择树莓派64位系统(注意,不要选Lite,Lite不带图形界面),TF卡,点击“烧录”按钮。
烧录完成后,拔出读卡器,将TF卡插到树莓派主板上,通电等待启动即可。
因为烧录的图形化界面的系统,这里最好给树莓派接上显示器、鼠标、键盘,根据显示,依次设置用户名、密码、wifi等。
网上关于树莓派怎么安装,有很多教程,有不清楚的可以直接问搜索引擎。
远程 能正常进入系统后,可以按照如下所示将vnc、ssh服务都打开
vnc 支持远程图形界面访问
ssh 支持远程命令行访问
这意味着,之后将无需显示器、鼠标、键盘这些设备,也能通过其他电脑对树莓派进行控制。
当然前提是路由器分配给树莓派的内网ip要可知(最好固定下来),可通过命令行输入ip a
进行查询。
网上关于vnc、ssh的教程有很多,这里不展开说了。
安装samba smb是一个比较通用的资源共享协议,windows天然支持,树莓派则需要安装samba:
1 2 3 4 5 6 # 更新apt sudo apt-get update# 安装vim sudo apt-get install vim # 安装samba sudo apt-get install samba
此时可以接入硬盘,树莓派会自动挂载在/media/pi
下面,我这里路径为/media/pi/Elements
对samba进行配置
1 sudo vim /etc/samba/smb.conf
在文件的末尾追加如下内容,将整个media目录进行共享:
1 2 3 4 5 6 7 [myshare] path = /media writeable =Yes create mask=0777 directory mask=0777 public =yes browseable =yes
设置smb用户密码:
1 2 sudo smbpasswd -a pi# pi为用户名,之后按照提示,依次设定密码
重启服务:
1 sudo systemctl restart smbd
重启完成后,便可远程访问硬盘上的资源。
以windows举例,只需在“映射网络驱动器”中输入\\${树莓派ip}\myshare
,然后使用上面设置的smb用户密码登入即可:
安装minidlna 我家电视是不支持smb的(可能支持,只是我不会用),为了能直接播放硬盘上的视频,还需要给树莓派安装minidlna:
1 sudo apt-get install minidlna
在移动硬盘上建立视频文件夹,该文件夹后续用来存放视频:
1 mkdir -p /media/pi/Elements/nas/video
修改minidlna配置:
1 sudo vim /etc/minidlna.conf
主要是media_dir
这一行, 将视频目录指向刚创建的文件夹:
1 media_dir =V,/media/pi/Elements/nas/video
重启minidlna服务
1 sudo service minidlna start
可以往/media/pi/Elements/nas/video
目录拷一个mp4文件上去,用电视测试一下,一般是可以正常播放了的。
安装下载器 对于下载器,我没怎么研究,目前只用过windows上的qbittorrent
,感觉还不错,给树莓派也装了一个:
1 sudo apt-get install qbittorrent
长这样(文件丢失是因为我暴力移动了下载文件的位置):
后续打算利用树莓派进行BT下载,下载目录为/media/pi/Elements/nas/video/new/
。
也许有其他命令行的下载器,比qbittorrent更好用,后面再研究研究。
至此,就算折腾完毕了。
个人定制 因为我找新番的论坛,最外层页面只有磁力链接的特征码,我设想的使用方式是:
用PC上论坛收集特征码,将特征码写到共享盘上某个文本文件上 远程VNC树莓派,运行脚本,自动拼接磁力链接,并拷贝到剪切板 打开qbittorrent,新建(会自动读取剪切板的内容),开始下载 下载完后,根据某定义的规则,将视频分目录进行归档存放 于是我规划了一下文件目录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 创建下载辅助目录 mkdir -p /media/pi/Elements/nas/qbit cd /media/pi/Elements/nas/qbit# 创建特征码收集文件 touch hash.txt# 创建视频分类规则文件 touch dir.json# 创建脚本文件夹,内存放有文件qbit_tool.py mkdir -p /tools touch /tools/qbit_tool.py vim /tools/qbit_tool.py # 将后面的脚本内容拷贝进该文件即可
特征码文件长这样:
分类规则文件是个json文件,由n对k-v组成,key是视频分类的目录,value是一组可能出现在视频文件名中的字符串(有的字幕组会用罗马拼音,有的字幕组直接使用汉字),这个文件具体内容需要自己进行维护,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 { "不死少女杀人笑剧" : [ "Undead Girl Murder Farce" ], "无职转生S2" : [ "Mushoku Tensei II" ], "夫妻交欢" : [ "Fuufu Koukan" ] }
python脚本内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 import jsonimport osimport shutilimport sysimport pandas.io.clipboard as cb MAGNET_PREFIX = "magnet:?xt=urn:btih:" HASH_FILE = "/media/pi/Elements/nas/qbit/hash.txt" RESULT_FILE = "/media/pi/Elements/nas/qbit/result/result.txt" JSON_FILE = "/media/pi/Elements/nas/qbit/dir.json" NEW_VIDEO_PATH = "/media/pi/Elements/nas/video/new" LF = "\n" CRLF = "\r\n" def archive_new_video (new_path, json_file ): home_path = os.path.split(new_path)[0 ] videos = os.listdir(new_path) with open (json_file, encoding="utf-8" ) as f: dir_relation = json.load(f) for video in videos: for k, v in dir_relation.items(): for name in v: if name in video: target_dir = os.path.join(home_path, k) if not os.path.exists(target_dir): os.makedirs(target_dir) target_path = os.path.join(target_dir, video) ori_path = os.path.join(new_path, video) shutil.move(ori_path, target_path) print ("move [%s] --> [%s]" % (ori_path, target_path))def del_path (path ): if os.path.exists(path): print ("now remove last result file: " + path) os.remove(path)def write_txt_result (result, result_path ): path_list = os.path.split(result_path) parent_path = path_list[0 ] if not os.path.exists(parent_path): os.makedirs(parent_path) with open (result_path, 'a' , encoding='utf-8' ) as f: f.write(result)def gen_full_magnet (ori_path, result_path, prefix ): with open (ori_path, 'r' ) as f: lines = f.readlines() result = "" for line in lines: result = result + prefix + line cb.copy(result) print (result)if __name__ == '__main__' : arg = sys.argv[1 ] if arg == "link" : gen_full_magnet(HASH_FILE, RESULT_FILE, MAGNET_PREFIX) elif arg == "archive" : archive_new_video(NEW_VIDEO_PATH, JSON_FILE) else : print ("input error." ) input ("press any button." )
实际使用时,需要先安装一个依赖包:
设置别名
1 alias qbit="python /media/pi/Elements/nas/qbit/tools/qbit_tool.py"
生成磁力链接
下载完成后进行归档