感謝IT之家網(wǎng)友 晨旭喵 的投稿
寫在前面:
昨天我寫了篇教程(IT之家學(xué)院:利用樹莓派在B站24小時(shí)直播音樂),評論里有很多人都想要點(diǎn)歌功能。
點(diǎn)歌這個(gè)功能吧,其實(shí)想加也不算太難,可是啊…這是樹莓派??!直播姬彈幕姬實(shí)時(shí)渲染什么的帶不動(dòng)的啊?。ê孟褚惭b不上)
可是啊…點(diǎn)歌這個(gè)功能好像也是很有必要的呢……
所以呢…我今天花了一個(gè)上午+一個(gè)中午的時(shí)間自己做了一個(gè)能在樹莓派上運(yùn)行的點(diǎn)歌臺(tái),雖然很簡陋,但是能實(shí)現(xiàn)這個(gè)功能就已經(jīng)很不錯(cuò)了嘛
(不會(huì)php和python的我靠著搜索引擎用php和python實(shí)現(xiàn)了這個(gè)功能…不是計(jì)算機(jī)專業(yè)的我已經(jīng)盡力了……)
最終效果:http://live.bilibili.com/16703
本文著重于講解如何搭建,不會(huì)涉及代碼的詳細(xì)解釋。
下面開始教程
第一步:
請先按照之前的教程裝上該裝的東西(IT之家學(xué)院:利用樹莓派在B站24小時(shí)直播音樂)
第二步:安裝python的庫
我們的python腳本需要一些必不可少的庫,依次運(yùn)行下面兩個(gè)命令進(jìn)行安裝:
sudo pip install eyed3
sudo pip install pathlib
第三步:安裝nginx+php環(huán)境
這一步是為了能運(yùn)行點(diǎn)歌的網(wǎng)頁
安裝nginx:
sudo apt-get install nginx
啟動(dòng) nginx:
sudo /etc/init.d/nginx start
接下來修改配置文件:
sudo nano /etc/nginx/sites-available/default
在 “l(fā)isten 80” 那個(gè)大括號(hào)里,把 “index index.html index.htm” 后面加上 “index.php”,像下面這樣:
listen 80;
root /usr/share/nginx/www;
index index.html index.htm index.php;
然后再找到 php 那一段,改成下面這樣:
location ~ .php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
改完配置文件之后,保存關(guān)閉(ctrl+o回車,ctrl+x)。
安裝 php 和必要組件:
sudo apt-get install php5-fpm php5-sqlite
重啟 nginx:
sudo /etc/init.d/nginx reload
如果你不嫌煩的話,可以再把所有php組件裝上,我也不知道后面的代碼需不需要這些東西,因?yàn)槲胰佳b上了??
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
第四步:內(nèi)網(wǎng)穿透(有公網(wǎng)IP的各位可以跳過,你們直連ip就行了)
網(wǎng)站搭建好了,我們要實(shí)現(xiàn)別人可以訪問,可是呢,我這里是學(xué)校的局域網(wǎng)(哭),所以需要內(nèi)網(wǎng)穿透。
這里我是用的是ngrok,水家之前有人發(fā)過nat123的,感興趣的可以去找找。
其實(shí)用法很簡單(如果你不想自己搭建服務(wù)器的話)。
用 ngrok.cc 提供的服務(wù)舉例:
首先到后臺(tái)開通一個(gè)隧道,隧道協(xié)議選擇 “http”、本地端口寫你前面設(shè)置的端口(前面配置文件里寫的是 80)“127.0.0.1:80” 其他的按照自己的需求來寫就行,
然后下載官網(wǎng)提供的軟件,樹莓的話要選linux arm版,
下載之后先給 777 權(quán)限:
sudo chmod 777 xxxx#文件名
然后按教程運(yùn)行就行了:
./sunny clientid xxxxxxxxxxxxxx
如果前面沒有做錯(cuò)什么的話,你的網(wǎng)站應(yīng)該就能從ngrok.cc里獲取的鏈接里訪問了。
第五步:點(diǎn)歌系統(tǒng)所需的php文件
這里php所需要實(shí)現(xiàn)的功能就是:
1.可以自動(dòng)搜索歌曲;
2.可以獲取到歌曲的下載鏈接;
我網(wǎng)上找到一個(gè)遠(yuǎn)古的網(wǎng)易云api,所以我就拿來用了。
php代碼在水家文章里發(fā)可能被轉(zhuǎn)碼,所以我發(fā)到了這里:glist。
php文件放置請放到/usr/share/nginx/www/這一級文件夾的下面任意位置(你要保證別人能訪問),
為了能讓腳本正常運(yùn)行,建議在賦予其讀寫文件夾的權(quán)限:
sudo chmod -R 777 /usr/share/nginx/www/
注意事項(xiàng):本人的php水平不高,畢竟沒有系統(tǒng)性學(xué)過,這個(gè)文件是靠著必應(yīng)來的代碼拼湊+模仿寫成的,可能會(huì)有漏洞(應(yīng)該問題不大)。
第六步:使用python腳本實(shí)現(xiàn)下載歌曲、調(diào)用ffmpeg渲染視頻的功能
python腳本如下,請注意縮進(jìn)和準(zhǔn)備好游標(biāo)卡尺(筆者將php文件放到了/usr/share/nginx/www/songs/文件夾):
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 #獲取音樂時(shí)長,為渲染一圖流視頻做準(zhǔn)備
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') #渲染一圖流視頻,參數(shù)都是我做完試出來的,尤其是-pix_fmt yuv420p這個(gè)參數(shù),缺了它視頻就是黑屏了
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') #刪掉臨時(shí)文件
os.remove('SinglePictureVideo.mp4')
os.remove('/usr/share/nginx/www/songs/'+str(i)+'.txt')
print(str(i)+'output finished')
time.sleep(10)
注意事項(xiàng):本人的python水平也不高,所以……(逃
第六步:做好視頻封面
請?jiān)趐y腳本的同級目錄新建三十個(gè)png圖片,文件名也要1-30,看我多么有誠意的手繪(真難看):
第七步:修改ffmpeg運(yùn)行腳本
因?yàn)槲覀兪沁\(yùn)行多個(gè)文件,所以我們需要連續(xù)推流,這時(shí)ffmpeg網(wǎng)站的幫助文檔就起作用了(我找了半天沒找到發(fā)現(xiàn)官網(wǎng)就有…
官網(wǎng)說明:https://trac.ffmpeg.org/wiki/Concatenate
下面直接說做法了,首先新建一個(gè)txt,內(nèi)容類似為:
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'
然后多復(fù)制粘貼十幾遍保存,免得放完又重啟,
啟動(dòng)的sh腳本也不能用昨天的了,要改成下面的樣子:
#!/bin/bash
while true
do
ffmpeg -re -f concat -safe 0 -i playlist.txt -vcodec copy -acodec aac -b:a 192k -f flv "你的。。。那啥網(wǎng)址和碼"
done
注意本sh腳本要與playlist.txt在同級目錄(廢話)…
這樣ffmpeg就會(huì)連續(xù)按txt里的順序進(jìn)行推流。
第八步:把初始視頻文件生成好
這一步非常簡單,就是把1-30.flv全部生成完就行,
我這里全部選擇了“種太陽”,我對不起直播間的那位小伙伴(Sortana)的耳朵??
第九步:啟動(dòng)。。
啟動(dòng)就行了。。
screen nohup sh live.sh &
screen nohup python live.py &
教程完畢。
由于內(nèi)容比較多,可能有遺漏的部分,請諒解。
廣告聲明:文內(nèi)含有的對外跳轉(zhuǎn)鏈接(包括不限于超鏈接、二維碼、口令等形式),用于傳遞更多信息,節(jié)省甄選時(shí)間,結(jié)果僅供參考,IT之家所有文章均包含本聲明。