r1a dev

惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。俱往矣,数风流人物,还看今朝。

首页
关于
链接
Admin
RSS
Email


一个简易的网页音乐播放器

  • 作者: runoneall
  • 时间: 2025-01-12
  • 分类: 默认分类

功能:播放,暂停,快进,后退,进度条拖动
Image description

使用:

  1. 下载资源:player.css player.js
  2. 在网页任意位置加入 <div class="audio-player"></div>
  3. 在头部引入css,在末尾引入js
  4. 编写js

    audio_source.src = 音频URL;
    audio_play();    // 开始播放

源码:
player.css

.audio-player {
    width: 300px;
    height: 65px;
    border: 1px solid black;
    overflow: hidden;
    white-space: nowrap;
    background: white;
}
#audio-avatar {
    height: auto;
    width: auto;
    max-height: 100%;
    margin-right: 10px;
    float: left;
}
.audio-info {
    overflow: hidden;
    position: relative;
}
#audio-title {
    display: inline-block;
    padding-left: 100%;
    animation: showFullTitle 10s linear infinite;
}
@keyframes showFullTitle {
    0% { transform: translateX(0%); }
    100% { transform: translateX(-100%); }
}
.audio-progress {
    display: inline-block;
}
.audio-control {
    margin-right: 5px;
    float: right;
}

player.js

document.querySelector('.audio-player').innerHTML = `<svg id="audio-avatar" viewBox="0 0 1024 1024" version="1.1"
    xmlns="http://www.w3.org/2000/svg">
    <path
        d="M391.424 938.688a48.896 48.896 0 0 1-49.92-49.728V212.928c0-24.832 18.304-44.8 41.6-49.728l497.344-77.888a49.984 49.984 0 0 1 39.936 11.648c11.648 9.92 16.64 23.168 16.64 38.08V812.8c0 28.16-21.632 49.664-49.92 49.664a48.896 48.896 0 0 1-49.92-49.728V193.024l-397.568 61.312v634.624c1.664 28.16-21.568 49.728-48.192 49.728z"
        fill="#172B4D"></path>
    <path
        d="M888.768 862.464H632.576a48.896 48.896 0 0 1-49.92-49.728v-142.464c0-28.16 21.696-49.728 49.92-49.728h256.192c28.288 0 49.92 21.504 49.92 49.728v142.464a51.072 51.072 0 0 1-49.92 49.728z m-206.272-99.456h156.352v-43.072h-156.352v43.072zM391.424 938.688H135.232a48.896 48.896 0 0 1-49.92-49.728v-142.464c0-28.16 21.632-49.728 49.92-49.728h256.192c28.288 0 49.92 21.504 49.92 49.728v142.464a49.92 49.92 0 0 1-49.92 49.728z m-206.272-99.456h156.352v-43.072H185.152v43.072z"
        fill="#172B4D"></path>
</svg>
<div class="audio">
    <div class="audio-info">
        <audio id="audio-source" src type="audio/mpeg"></audio>
        <span id="audio-title">No Audio To Play</span><br>
    </div>
    <div class="audio-progress">
        <input type="range" id="audio-range" min="0" max="100" value="0"
            step="0.01">
        <label id="audio-time" for="audio-range">0:00 / 0:00</label>
    </div>
    <div class="audio-control">
        <button onclick="audio_back5s()">-5s</button>
        <button onclick="audio_play()">Play</button>
        <button onclick="audio_stop()">Stop</button>
        <button onclick="audio_forward5s()">+5s</button>
    </div>
</div>`;

const audio_source = document.getElementById('audio-source');
const audio_title = document.getElementById("audio-title");
let current_audio_title = "";
const audio_range = document.getElementById("audio-range");
const audio_time = document.getElementById("audio-time");
let audio_end_time_length = 0;

function audio_play() {
    if (audio_source.paused) {
        const new_audio_title = decodeURI(audio_source.src.split('/').pop().split('.').shift());
        if (current_audio_title != new_audio_title) {
            audio_title.textContent = new_audio_title;
            current_audio_title = audio_title.textContent;
            audio_source.load();
        }
        audio_source.play();
    }
}
function audio_stop() {
    if (!audio_source.paused) {
        audio_source.pause();
    }
}
function audio_back5s() {
    audio_play();
    audio_source.currentTime -= 5;
}
function audio_forward5s() {
    audio_play();
    audio_source.currentTime += 5;
}

function audio_current_time() {
    const audio_currentTime = audio_source.currentTime;
    const audio_time_minutes = Math.floor(audio_currentTime / 60).toString();
    const audio_time_seconds = Math.floor(audio_currentTime % 60).toString().padStart(2, '0');
    const audio_end_time = audio_time.textContent.slice(0-audio_end_time_length);
    return `${audio_time_minutes}:${audio_time_seconds}` + " / " + audio_end_time;
}
audio_source.onloadedmetadata = function() {
    const audio_duration = audio_source.duration;
    audio_range.max = audio_duration;
    const audio_time_minutes = Math.floor(audio_duration / 60).toString();
    const audio_time_seconds = Math.floor(audio_duration % 60).toString().padStart(2, '0');
    audio_end_time_length = audio_time_minutes.length + audio_time_seconds.length + 1;
    audio_time.textContent = "0:00 / " + `${audio_time_minutes}:${audio_time_seconds}`;
}
audio_source.ontimeupdate = function() {
    audio_range.value = audio_source.currentTime;
    audio_time.textContent = audio_current_time();
}
audio_range.oninput = function() {
    audio_play();
    audio_source.currentTime = audio_range.value;
    audio_time.textContent = audio_current_time();
}

demo:https://runoneall.serv00.net/WebLitePlayer/

标签: none

评论已关闭

  • 上一篇: 识别bilibili中的视频bgm并下载
  • 下一篇: flask简易doh服务器
© 2025 r1a dev. Old Fasion Theme. Powered by Typecho.