zoukankan      html  css  js  c++  java
  • asp.net 实现LRC歌词播放

    这个其实很简单,此功能包含一个asp.net UserControl和asp.net引用页面。

    LRCPlayer.ascx

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="LRCPlayer.ascx.cs" Inherits="UserControls_LRCPlayer" %>
    <div style="<%#Width%>;height:<%#Height%>;border:1px solid gray;overflow:auto;">
        <asp:Repeater runat="server" ID="rptLRC">
            <HeaderTemplate>
            <div>歌曲:<%#this.TI %></div>
            <div>演唱:<%#this.AR %></div>
            <ul style="list-style-type:none;">
            </HeaderTemplate>
            <ItemTemplate>
                <li id="<%#this.rptLRC.ClientID %>_<%#Eval("Key") %>"><%#Eval("Value") %></li>
            </ItemTemplate>
            <FooterTemplate>
            </ul>
            </FooterTemplate>
        </asp:Repeater>
    </div>
    <script type="text/javascript">
        function <%=this.rptLRC.ClientID %>_Play()
        {
            var <%=this.rptLRC.ClientID %>_preFix = "<%=this.rptLRC.ClientID %>_";
            var <%=this.rptLRC.ClientID %>_keys = new Array();
        <%
            for (var i = 0; i < this.LRCList.Count; i++)
            { 
        %>
            <%=this.rptLRC.ClientID %>_keys[<%=i %>] = <%=this.LRCList[i].Key %>;
        <%
            }
        %>
            var startTime = new Date().getTime();
            var handle = setInterval(function()
            {
                var currentTime = new Date().getTime();
                var offsetTime = currentTime - startTime;
    
                var flag = false;
                for(var i = 0; i < <%=this.rptLRC.ClientID %>_keys.length; i++)
                {
                    var id = <%=this.rptLRC.ClientID %>_preFix + <%=this.rptLRC.ClientID %>_keys[i];
                    var lastVisibleIndex = i + 3;
                    if(lastVisibleIndex > <%=this.rptLRC.ClientID %>_keys.length - 1)
                    {
                        lastVisibleIndex = <%=this.rptLRC.ClientID %>_keys.length - 1;
                    }
                    var lastVisibleElementID = <%=this.rptLRC.ClientID %>_preFix + <%=this.rptLRC.ClientID %>_keys[lastVisibleIndex];
                    
                    if(!flag)
                    {
                        if(offsetTime < <%=this.rptLRC.ClientID %>_keys[i])
                        {
                            flag = true;
                            document.getElementById(id).style.color = "red";
                            document.getElementById(lastVisibleElementID).scrollIntoView(false);
                        }
                        else
                        {
                            document.getElementById(id).style.color = "black";
                        }
                    }
                    else
                    {
                        document.getElementById(id).style.color = "black";
                    }
                }
            },100);
        }
    
        <%=this.rptLRC.ClientID %>_Play();
    </script>

    LRCPlayer.ascx.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Text.RegularExpressions;
    using System.Diagnostics;
    
    public partial class UserControls_LRCPlayer : System.Web.UI.UserControl
    {
        private string LRC { get; set; }
        public string Width { get; set; }
        public string Height { get; set; }
        public bool AutoPlay { get; set; }
        public string TI { get; set; }
        public string AR { get; set; }
        public string AL { get; set; }
        public List<KeyValuePair<int, string>> LRCList { get; set; }
    
        public void LoadLRC(string lrc)
        {
            this.LRCList = new List<KeyValuePair<int, string>>();
            var items = lrc.Split(new string[] { "\r\n" }, StringSplitOptions.None);
            foreach (var line in items)
            {
                var regTI = new Regex(@"\[ti\:.{0,}\]", RegexOptions.IgnoreCase);
                var regAR = new Regex(@"\[ar\:.{0,}\]");
                var regAL = new Regex(@"\[al\:.{0,}\]");
                var regContent = new Regex(@"(\[\d{2}\:\d{2}(\.\d{2,}){0,}\])+.+");
                if (regTI.IsMatch(line))
                {
                    this.TI = line.Substring(4, line.Length - 5);
                    continue;
                }
                else if (regAR.IsMatch(line))
                {
                    this.AR = line.Substring(4, line.Length - 5);
                    continue;
                }
                else if (regAL.IsMatch(line))
                {
                    this.AL = line.Substring(4, line.Length - 5);
                    continue;
                }
                else if (regContent.IsMatch(line))
                {
                    var regTime = new Regex(@"\[\d{2}\:\d{2}(\.\d{2,}){0,}\]");
                    var regText = new Regex(@"");
                    var matches = regTime.Matches(line);
                    foreach (Match match in matches)
                    {
                        int timer = 0;
                        var time = match.Value.Substring(1, match.Value.Length - 2).Split(new char[] { ':', '.' });
                        if (time.Length > 0)
                            timer += int.Parse(time[0]) * 60 *1000;
                        if (time.Length > 1)
                            timer += int.Parse(time[1]) * 1000;
                        if (time.Length > 2)
                            timer += int.Parse(time[2]);
                        
                        var lastMatch = matches[matches.Count - 1];
                        var text = line.Substring(lastMatch.Index + lastMatch.Length);
                        this.LRCList.Add(new KeyValuePair<int, string>(timer, text));
                    }
                    continue;
                }    
            }
            this.LRCList = this.LRCList.OrderBy(item => item.Key).ToList();
            rptLRC.DataSource = this.LRCList;
            rptLRC.DataBind();
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(this.Width))
                this.Width = "auto";
            if (string.IsNullOrWhiteSpace(this.Height))
                this.Height = "auto";
            this.DataBind();
        }
    }

    lrc.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="lrc.aspx.cs" Inherits="lrc" %>
    
    <%@ Register src="UserControls/LRCPlayer.ascx" tagname="LRCPlayer" tagprefix="uc1" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <table cellpadding="10px">
            <tr>
                <td><uc1:LRCPlayer ID="LRCPlayer1" runat="server" Width="400px" Height="500px" /></td>
                <td><uc1:LRCPlayer ID="LRCPlayer2" runat="server" Width="400px" Height="500px" /></td>
            </tr>
        </table>
        </form>
    </body>
    </html>

    lrc.aspx.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.IO;
    using System.Text;
    
    public partial class lrc : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var path = Server.MapPath("./lrc/俩俩相忘.lrc");
            var a = new System.IO.StreamReader(path, Encoding.Default);
            var lrc = a.ReadToEnd();
            LRCPlayer1.LoadLRC(lrc);
    
            path = Server.MapPath("./lrc/难念的经.lrc");
            a = new System.IO.StreamReader(path, Encoding.Default);
            lrc = a.ReadToEnd();
            LRCPlayer2.LoadLRC(lrc);
        }
    }
  • 相关阅读:
    Delphi xe8 FMX StringGrid根据内容自适应列宽。
    Delphi 10.3.1 Secure File Sharing解决应用间文件共享
    分享一个求时间差大于多少秒的函数
    解决android 9上无法使用http协议
    【转】FMX 动态创建及销毁(释放free)对象
    ChinaCock界面控件介绍-TCCBarcodeCreator
    IDE Fix Pack 6.4.4 released (bugfix release)
    Android & iOS 启动画面工具
    REST easy with kbmMW #24 使用kbmMW实现JSON/XML/YAML转换成对象
    关于ElasticSearch的聚类时出现fielddata=true问题
  • 原文地址:https://www.cnblogs.com/nanfei/p/2833437.html
Copyright © 2011-2022 走看看