pix音乐播放器实现歌词显示、音量调节和伪自动播放
本文是《技术相关(共39篇)》目录的第 5 篇。阅读本文前,建议先阅读本文前3篇文章:
感谢"薄荷的猫草"提供音乐API实现歌词显示。
2023.10.29日在其基础上更新功能:
仅在手机播放时添加监听:手机播放状态下,监听播放状态,当暂停或播放结束时隐藏歌词,当恢复播放、重新播放或切换歌曲时重新显示歌词。电脑播放状态下维持目前不变,因为歌词在左下角,不影响页面浏览体验。
歌词显示代码,复制下面代码放到pix设置-扩展设置-底部HTML代码。
[reply]
<script>
//在原音乐图标下增加歌词开关
$('.t_music').after('<div class="t_lrc top_tool icon_color" style="margin-bottom: 8px;">\
<a class="bg_lrc"><i class="ri-play-list-line"></i></a>\
</div>');
$('a.bg_lrc').css({
"padding": "7px",
"display": "flex",
"line-height": "1",
"background": "#c4d0e6",
"border-radius": "8px"
});
$('a.bg_lrc i').css({
"color": "#44507b",
"fontSize": "16px",
});
$('.bg_lrc').click(function() {
if (lyricsContainer.css('display') === 'none') {
lyricsContainer.css('display', 'block');
$('a.bg_lrc i').css({
"color": "#44507b",
});
$('a.bg_lrc').css({
"background": "#c4d0e6",
});
} else {
lyricsContainer.css('display', 'none');
$('a.bg_lrc i').css({
"color": "#aeaeae",
});
$('a.bg_lrc').css({
"background": "rgb(196 208 230 / 38%)",
});
}
});
//创建容器
var lyricsContainer = $('<div class="lyrics-container"></div>');
$('.player_box').append(lyricsContainer);
var css = $(window).width() > 767 ?
{
//桌面歌词css(按照下面格式自行修改)
position: 'fixed',
bottom: '1px',
left: '0.1%',
width: '200px',
height: '100px',
overflow: 'hidden',
zIndex: '999',
pointerEvents: 'none',
} :
{
//移动端歌词css(按照下面格式自行修改)
position: 'fixed',
bottom: '88px',
left: '0',
width: '100%',
height: '72px',
textAlign: 'center',
overflow: 'hidden',
zIndex: '999',
pointerEvents: 'none',
};
lyricsContainer.css(css);
var lyricsMap = {};
var isMobile = $(window).width() <= 767;
var isPlaying = false;
// 获取歌词
async function fetchLyrics(id) {
if (!lyricsMap[id]) {
var lrcOriginal = await $.get('https://bohecat.com/musicapi/?type=lrc&id=' + id);
lyricsMap[id] = parseLyrics(lrcOriginal);
}
return lyricsMap[id];
}
// 解析歌词
function parseLyrics(lrcOriginal) {
var lyrics = [];
var lines = lrcOriginal.split("\n");
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
if (!line.trim()) {
continue;
}
var timeAndText = line.split("]");
var time = timeAndText[0].substr(1);
var text = timeAndText[1];
// 增加代码:如果歌词为空,跳过此次循环
if (!text.trim()) {
continue;
}
// 增加代码:把时间转换成秒
var timeInSeconds = 0;
var timeParts = time.split(":");
timeInSeconds += parseInt(timeParts[0], 10) * 60 - 0.5;
timeInSeconds += parseFloat(timeParts[1]);
lyrics.push({
time: timeInSeconds,
text: text
});
}
return lyrics;
}
// 更新歌词
function updateLyrics(currentTime, lyrics) {
for (var i = 0; i < lyrics.length; i++) {
if (currentTime >= lyrics[i].time && (i === lyrics.length -1 || currentTime < lyrics[i+1].time)) {
// 创建4行歌词
// 防止数组i越界
var currentLine3 = "";
if (i - 1 >= 0 && typeof lyrics[i-1].text === "string") {
currentLine3 = lyrics[i-1].text;
}
var currentLine = "";
if (typeof lyrics[i].text === "string") {
currentLine = lyrics[i].text;
}
var currentLine1 = "";
if (i + 1 < lyrics.length && typeof lyrics[i+1].text === "string") {
currentLine1 = lyrics[i+1].text;
}
var currentLine2 = "";
if (i + 2 < lyrics.length && typeof lyrics[i+2].text === "string") {
currentLine2 = lyrics[i+2].text;
}
//歌词文本css(修改style内的内容即可)
lyricsContainer.html(`
<div class="current-line" style="color: #484848; font-size: 10px;opacity: .4;">${currentLine3}</div>
<div class="current-line" style="color: #000000; font-size: 14px;">${currentLine}</div>
<div class="current-line" style="color: #484848; font-size: 12px;opacity: .4;">${currentLine1}</div>
<div class="current-line" style="color: #484848; font-size: 10px;opacity: .1;">${currentLine2}</div>
`);
// 增加代码:添加从下往上线性滚动的动画
$('.current-line').animate({
top: '-=30px'
}, 2000, function() {
$(this).css({
top: '30px'
});
});
}
}
}
// 监听音频播放进度更新事件,更新歌词
audiobox[0].addEventListener("timeupdate", async function () {
var media = this;
var id = media.getAttribute('src').split('id=')[1];
var lyrics = await fetchLyrics(id);
updateLyrics(this.currentTime, lyrics);
});
// 监听音频播放状态事件,根据播放状态显示或隐藏歌词
audiobox[0].addEventListener("play", function () {
if (isMobile && !isPlaying) {
lyricsContainer.css('display', 'block');
}
isPlaying = true;
});
audiobox[0].addEventListener("pause", function () {
if (isMobile) {
lyricsContainer.css('display', 'none');
}
isPlaying = false;
});
audiobox[0].addEventListener("ended", function () {
if (isMobile) {
lyricsContainer.css('display', 'none');
}
isPlaying = false;
});
// 监听手机播放状态
if (isMobile) {
audiobox[0].addEventListener("play", function () {
lyricsContainer.css('display', 'block');
});
audiobox[0].addEventListener("pause", function () {
lyricsContainer.css('display', 'none');
});
audiobox[0].addEventListener("ended", function () {
lyricsContainer.css('display', 'none');
});
$('.t_music').click(function () {
lyricsContainer.css('display', 'block');
});
$('.audio-next').click(function () {
lyricsContainer.css('display', 'block');
});
$('.audio-prev').click(function () {
lyricsContainer.css('display', 'block');
});
}
</script>
[/reply]
点击任何位置自动播放,同上复制到pix设置-扩展设置-底部HTML代码。
<script>
// 屏幕宽度大于768执行
if (screen && screen.width > 768) {
// 点击 body 任何位置就播放音乐,并只执行一次
var body = document.querySelector('body');
// 给 body 绑定 click 事件
body.addEventListener('click', bj);
function bj(){
// 执行播放代码
audiobox[0].play();//播放背景音乐
audioplay(); //播放后执行的函数
body.removeEventListener("click",bj);// 给 body 解除 click 事件绑定
}
}
// 5s隐藏音乐播放器
trigger = setTimeout(function(){
mu_box_hide();
},5000); // 5s隐藏音乐播放器
</script>
音量调节,添加到pix设置-扩展设置-自定义Javascript。修改var finalLong = 25;里的25即可。
// 背景音乐音量调节
var finalLong = 25;
audiobox[0].volume = finalLong / 100;
$('.vo_size').height(finalLong);
您已阅读完《技术相关(共39篇)》目录的第 5 篇。请继续阅读本文后3篇文章:
SenLinM
看看
似水流年
欢迎😊
SenLin
我的账号突然失效了
似水流年
换了主题之后,这是个单用户博客。麻烦重新注册一下吧。😂
SenLin
这是为什么 找回密码也没有