感谢IT之家网友 晨旭喵 的投稿
写在前面:
之前我写了篇教程(用树莓派在B站24小时直播音乐),评论里有很多人都想要点歌功能。
点歌这个功能吧,其实想加也不算太难,可是啊…这是树莓派啊!直播姬弹幕姬实时渲染什么的带不动的啊!(好像也装不上)
可是啊…点歌这个功能好像也是很有必要的呢……
所以呢…我今天花了一个上午+一个中午的时间自己做了一个能在树莓派上运行的点歌台,虽然很简陋,但是能实现这个功能就已经很不错了嘛
(不会php和python的我靠着搜索引擎用php和python实现了这个功能…不是计算机专业的我已经尽力了……)
最终效果:http://live.bilibili.com/16703
本文着重于讲解如何搭建,不会涉及代码的详细解释。
下面开始教程
第一步:
请先按照之前的教程装上该装的东西(IT之家学院:利用树莓派在B站24小时直播音乐)
第二步:安装python的库
我们的python脚本需要一些必不可少的库,依次运行下面两个命令进行安装:
1 2 | sudo pip install eyed3 sudo pip install pathlib |
第三步:安装nginx+php环境
这一步是为了能运行点歌的网页
安装nginx:
1 | sudo apt-get install nginx |
启动 nginx:
1 | sudo /etc/init .d /nginx start |
接下来修改配置文件:
1 | sudo nano /etc/nginx/sites-available/default |
在 “listen 80” 那个大括号里,把 “index index.html index.htm” 后面加上 “index.php”,像下面这样:
1 2 3 | listen 80; root /usr/share/nginx/www; index index.html index.htm index.php; |
然后再找到 php 那一段,改成下面这样:
1 2 3 4 5 | location ~ .php$ { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } |
改完配置文件之后,保存关闭(ctrl+o回车,ctrl+x)。
安装 php 和必要组件:
1 | sudo apt-get install php5-fpm php5-sqlite |
重启 nginx:
1 | sudo /etc/init .d /nginx reload |
如果你不嫌烦的话,可以再把所有php组件装上,我也不知道后面的代码需不需要这些东西,因为我全都装上了。
1 | sudo apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5- ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl |
第四步:内网穿透(有公网IP的各位可以跳过,你们直连ip就行了)
网站搭建好了,我们要实现别人可以访问,可是呢,我这里是学校的局域网(哭),所以需要内网穿透。
这里我是用的是ngrok,水家之前有人发过nat123的,感兴趣的可以去找找。
其实用法很简单(如果你不想自己搭建服务器的话)。
用 ngrok.cc 提供的服务举例:
首先到后台开通一个隧道,隧道协议选择 “http”、本地端口写你前面设置的端口(前面配置文件里写的是 80)“127.0.0.1:80” 其他的按照自己的需求来写就行,
然后下载官网提供的软件,树莓的话要选linux arm版,
下载之后先给 777 权限:
1 | sudo chmod 777 xxxx #文件名 |
然后按教程运行就行了:
1 | . /sunny clientid xxxxxxxxxxxxxx |
如果前面没有做错什么的话,你的网站应该就能从ngrok.cc里获取的链接里访问了。
第五步:点歌系统所需的php文件
这里php所需要实现的功能就是:
1.可以自动搜索歌曲;
2.可以获取到歌曲的下载链接;
我网上找到一个远古的网易云api,所以我就拿来用了。
php代码在水家文章里发可能被转码,所以我发到了这里:glist。
php文件放置请放到/usr/share/nginx/www/这一级文件夹的下面任意位置(你要保证别人能访问),
为了能让脚本正常运行,建议在赋予其读写文件夹的权限:
1 | sudo chmod -R 777 /usr/share/nginx/www/ |
注意事项:本人的php水平不高,毕竟没有系统性学过,这个文件是靠着必应来的代码拼凑+模仿写成的,可能会有漏洞(应该问题不大)。
第六步:使用python脚本实现下载歌曲、调用ffmpeg渲染视频的功能
python脚本如下,请注意缩进和准备好游标卡尺(笔者将php文件放到了/usr/share/nginx/www/songs/文件夹):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import os import urllib import eyed3 import time while True : for i in range ( 1 , 30 + 1 ): if (os.path.exists( '/usr/share/nginx/www/songs/' + str (i) + '.txt' )): #判断待渲染文件是否存在 f = open ( '/usr/share/nginx/www/songs/' + str (i) + '.txt' ) content = f.read() #读取文件 print ( 'downloading ' + str (i) + '.mp3' ) #debug urllib.urlretrieve(content, str (i) + '.mp3' ) #下载mp3文件 print ( 'download success' ) #debug xx = eyed3.load( str (i) + '.mp3' ) seconds = xx.info.time_secs #获取音乐时长,为渲染一图流视频做准备 os.system( 'ffmpeg -loop 1 -r 1 -t ' + str (seconds) + ' -f image2 -i ' + str (i) + '.png -vcodec libx264 -pix_fmt yuv420p -crf 24 -y SinglePictureVideo.mp4' ) #渲染一图流视频,参数都是我做完试出来的,尤其是-pix_fmt yuv420p这个参数,缺了它视频就是黑屏了 os.system( 'ffmpeg -i SinglePictureVideo.mp4 -i ' + str (i) + '.mp3 -c:v copy -c:a aac -y ' + str (i) + '.flv' ) #合并视频与音频 os.remove( str (i) + '.mp3' ) #删掉临时文件 os.remove( 'SinglePictureVideo.mp4' ) os.remove( '/usr/share/nginx/www/songs/' + str (i) + '.txt' ) print ( str (i) + 'output finished' ) time.sleep( 10 ) |
注意事项:本人的python水平也不高,所以……(逃
第六步:做好视频封面
请在py脚本的同级目录新建三十个png图片,文件名也要1-30,看我多么有诚意的手绘(真难看):
第七步:修改ffmpeg运行脚本
因为我们是运行多个文件,所以我们需要连续推流,这时ffmpeg网站的帮助文档就起作用了(我找了半天没找到发现官网就有…
官网说明:https://trac.ffmpeg.org/wiki/Concatenate
下面直接说做法了,首先新建一个txt,内容类似为:
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 | file '/home/pi/songs/1.flv' file '/home/pi/songs/2.flv' file '/home/pi/songs/3.flv' file '/home/pi/songs/4.flv' file '/home/pi/songs/5.flv' file '/home/pi/songs/6.flv' file '/home/pi/songs/7.flv' file '/home/pi/songs/8.flv' file '/home/pi/songs/9.flv' file '/home/pi/songs/10.flv' file '/home/pi/songs/11.flv' file '/home/pi/songs/12.flv' file '/home/pi/songs/13.flv' file '/home/pi/songs/14.flv' file '/home/pi/songs/15.flv' file '/home/pi/songs/16.flv' file '/home/pi/songs/17.flv' file '/home/pi/songs/18.flv' file '/home/pi/songs/19.flv' file '/home/pi/songs/20.flv' file '/home/pi/songs/21.flv' file '/home/pi/songs/22.flv' file '/home/pi/songs/23.flv' file '/home/pi/songs/24.flv' file '/home/pi/songs/25.flv' file '/home/pi/songs/26.flv' file '/home/pi/songs/27.flv' file '/home/pi/songs/28.flv' file '/home/pi/songs/29.flv' file '/home/pi/songs/30.flv' |
然后多复制粘贴十几遍保存,免得放完又重启。启动的sh脚本也不能用昨天的了,要改成下面的样子:
1 2 3 4 5 | #!/bin/bash while true do ffmpeg -re -f concat -safe 0 -i playlist.txt -vcodec copy -acodec aac -b:a 192k -f flv "你的。。。那啥网址和码" done |
注意本sh脚本要与playlist.txt在同级目录(废话)…
这样ffmpeg就会连续按txt里的顺序进行推流。
第八步:把初始视频文件生成好
这一步非常简单,就是把1-30.flv全部生成完就行,
我这里全部选择了“种太阳”,我对不起直播间的那位小伙伴(Sortana)的耳朵。
第九步:启动
启动就行了。。
1 2 | screen nohup sh live.sh & screen nohup python live.py & |
教程完毕。
由于内容比较多,可能有遗漏的部分,请谅解。
楼主,您好,看了您的文章,在给出的网易云api的那一部分,给出的glist的链接已经失效了,不能找到对应的api的资源,汪楼主能重新整理一下关于网易云api的资料,然后更新链接~辛苦了!
要是能做一个点播视频的就好了!!就是树莓派斗鱼直播电影在加强!可以点播下一部播放的电影!电影全在NAS上面,树莓派负责直播与点播。
见B站进