开源Blazor组件 > Audio播放器


Blazor中与js互动其实已经做的很方便很简单了,所以audio播放器也是相当的简单做起来,代码如下:
先写一个audio播放器组件,内容如下:

        @inject IJSRuntime JsRuntime
        <audio id="zmjhdaudio" style="display:none;" @onended="PlayNext" autoplay src="/Music/@WebUtility.UrlEncode(CurrentAudio!.Name).Replace("+", "%20")"></audio>
        <MudPaper Class="rounded" Style="background-color:transparent;position: fixed;width:240px;right: 8px;bottom: 8px;-webkit-transform: translate(-8px, -8px);transform: translate(-8px, -8px);">
            <MudToolBar Dense="true" Class="my-2">
            <MudAvatar Size="Size.Large">
            <MudImage Src="/Images/icon.jpg"></<MudImage>
                </<MudAvatar>
            <div style="display:inline-block">
            <MudTooltip Arrow="true" Color="Color.Default" Placement="Placement.Top" Text="@CurrentAudio!.Name">
            <MudText Typo="Typo.h6" Style="max-width:120px;white-space:nowrap;overflow-x:auto;overflow-y:hidden">@CurrentAudio!.Name</<MudText>
                    </<MudTooltip>
            <MudText Typo="Typo.body2">@CurrentAudio!.Extension</<MudText>
                </<div>
            </<MudToolBar>
            <MudToolBar Dense="true" Class="d-flex justify-space-around flex-grow-1 gap-4">
            <MudTooltip Arrow="true" Color="Color.Tertiary" Placement="Placement.Top" Text="逆序播放上一曲">
            <MudFab Size="Size.Small" Color="Color.Tertiary" OnClick="PlayPrev" StartIcon="@Icons.Material.Filled.SkipPrevious" />
                </<MudTooltip>
            <MudTooltip Arrow="true" Color="Color.Secondary" Placement="Placement.Top" Text="暂停/播放">
            <MudFab Size="Size.Small" Color="Color.Secondary" OnClick="PlayPause" StartIcon="@Icons.Material.Filled.PlayCircleOutline" />
                </<MudTooltip>
            <MudTooltip Arrow="true" Color="Color.Success" Placement="Placement.Top" Text="随机播放下一曲">
            <MudFab Size="Size.Small" Color="Color.Success" OnClick="PlayNext" StartIcon="@Icons.Material.Filled.SkipNext" />
                </<MudTooltip>
            </<MudToolBar>
        </<MudPaper>
        @code {
            /// <summary>
            /// 当前的所有曲目
            /// </<summary>
            private System.IO.FileInfo[]? mcs;
            private System.IO.FileInfo? CurrentAudio => currentAudioId >= 0 && currentAudioId < mcs?.Length ? mcs?[currentAudioId] : null;
            private int currentAudioId = 0;
            private Random audioRd = new Random();
            /// <summary>
            /// 标记当前是否正在播放中
            /// </<summary>
            private bool onPlay = true;
            /// <summary>
            /// 顺序播放上一曲
            /// </<summary>
            private void PlayPrev()
            {
                    currentAudioId--;
                    if (currentAudioId < 0) currentAudioId = mcs!.Length;
                    onPlay = true;
                    this.StateHasChanged();
            }
            /// <summary>
            /// 随机播放下一曲
            /// </<summary>
            private void PlayNext()
            {
                    currentAudioId = mcs!.Length < 1 ? 0 : audioRd.Next(mcs!.Length);
                    onPlay = true;
                    this.StateHasChanged();
            }
            /// <summary>
            /// 播放和暂停
            /// </<summary>
            private async void PlayPause()
            {
                    onPlay = !onPlay;
                    await JsRuntime.InvokeVoidAsync("ZmjAudioSetPlay", "zmjhdaudio", onPlay);
            }
            protected override void OnInitialized()
            {
                    var dic = new System.IO.DirectoryInfo($"{Environment.CurrentDirectory}\\wwwroot\\Music");
                    mcs = dic.GetFiles("*", SearchOption.TopDirectoryOnly);
                    currentAudioId = mcs!.Length < 1 ? 0 : audioRd.Next(mcs.Length);
                    base.OnInitialized();
            }
            protected override async Task OnAfterRenderAsync(bool firstRender)
            {
                    await base.OnAfterRenderAsync(firstRender);
                    if (!firstRender) return;
                    await JsRuntime.InvokeVoidAsync("import", "/SmallAudio/zmjaudio.js");
            }
        }
    
然后再写一个zmjaudio.js代码放在wwwroot文件夹下的某个位置,代码如下:

        window.ZmjAudioSetPlay = function (audioid, pstatue) {
            var audioElement = document.getElementById(audioid);
            if (pstatue == true) {
                audioElement.play()
            }
            else {
                audioElement.pause()
            }
        };
    
然后在需要的地方直接调用这个组件即可,比如:

        <ZmjAudio></ZmjAudio>