Silverlightを使用したオーディオプレイヤーの実装

Silverlightオーディオプレイヤーの概要

Silverlight技術を活用したオーディオ再生アプリケーションの実装例を紹介します。このプレイヤーは基本的な再生制御機能と進捗表示機能を備えています。

UIレイアウト設計

XAMLによるユーザーインターフェースの定義例を示します:

<Grid x:Name="MainLayout" Background="White" Height="237" Width="499">
    <MediaElement x:Name="audioPlayer" Height="0" HorizontalAlignment="Left" 
                 Margin="12,12,0,0" VerticalAlignment="Top" Width="0" 
                 LoadedBehavior="Manual" MediaEnded="OnMediaEnded" />
    
    <StackPanel Orientation="Horizontal" Margin="10,41,0,0">
        <Button Content="再生" Name="btnPlay" Width="75" Click="OnPlayClicked" />
        <Button Content="一時停止" Name="btnPause" Width="75" Click="OnPauseClicked" />
        <Button Content="停止" Name="btnStop" Width="75" Click="OnStopClicked" />
        <Button Content="ミュート" Name="btnMute" Width="75" Click="OnMuteClicked" />
        <Button Content="ダウンロード" Name="btnDownload" Width="75" Click="OnDownloadClicked" />
    </StackPanel>
    
    <Label Name="lblDownloadProgress" Margin="138,84,0,0" Width="120" />
    <TextBlock Text="再生位置:" Margin="10,113,0,0" />
    <Slider Name="progressSlider" Margin="64,108,0,0" Width="293" 
            ValueChanged="OnProgressChanged" />
    <Label Name="lblPlaybackTime" HorizontalAlignment="Right" Margin="0,113,12,0" Width="132" />
    <Label Name="lblPlayProgress" Margin="12,84,0,0" Width="120" />
    
    <TextBlock Text="音量:" Margin="259,147,0,0" />
    <Slider Name="volumeSlider" Margin="295,141,0,0" Width="100" 
            ValueChanged="OnVolumeChanged" />
    <Label Name="lblVolumeLevel" Margin="389,136,0,0" Width="59" />
    
    <Button Content="閉じる" HorizontalAlignment="Left" Margin="424,214,0,0" 
            Name="btnClose" Width="75" Click="OnCloseClicked" />
</Grid>

バックエンド処理の実装

C#による機能実装のコード例:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
using System.Windows.Forms;

namespace AudioPlayer
{
    public partial class AudioPlayerControl : UserControl
    {
        private string audioSourceUrl = string.Empty;
        private string saveDirectory = string.Empty;
        private string playbackStatus = "0";
        private DispatcherTimer statusTimer = new DispatcherTimer();
        
        public AudioPlayerControl()
        {
            InitializeComponent();
        }
        
        public AudioPlayerControl(string audioUrl)
        {
            try
            {
                InitializeComponent();
                audioSourceUrl = audioUrl;
                audioPlayer.Source = new Uri(audioSourceUrl, UriKind.Absolute);
                statusTimer.Interval = TimeSpan.FromMilliseconds(1000);
                statusTimer.Tick += UpdatePlaybackStatus;
                statusTimer.Start();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        
        private void UpdatePlaybackStatus(object sender, EventArgs e)
        {
            lblPlaybackTime.Content = string.Format(
                "再生時間:{0:00}:{1:00}:{2:00}",
                audioPlayer.Position.Hours,
                audioPlayer.Position.Minutes,
                audioPlayer.Position.Seconds);
                
            lblPlayProgress.Content = string.Format(
                "再生進捗:{0:##%}", 
                audioPlayer.DownloadProgress);
        }
        
        private void OnProgressChanged(object sender, 
            RoutedPropertyChangedEventArgs<double> e)
        {
            try
            {
                if (playbackStatus == "1")
                {
                    int sliderValue = (int)progressSlider.Value;
                    int totalDuration = (int)audioPlayer.NaturalDuration.TimeSpan.TotalSeconds;
                    TimeSpan newPosition = new TimeSpan(0, 0, 0, 0, sliderValue);
                    audioPlayer.Position = newPosition;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        
        private void OnPlayClicked(object sender, RoutedEventArgs e)
        {
            audioPlayer.Play();
            playbackStatus = "1";
        }
        
        private void OnPauseClicked(object sender, RoutedEventArgs e)
        {
            playbackStatus = "0";
            audioPlayer.Pause();
        }
        
        private void OnStopClicked(object sender, RoutedEventArgs e)
        {
            playbackStatus = "0";
            audioPlayer.Stop();
        }
        
        private void OnMuteClicked(object sender, RoutedEventArgs e)
        {
            audioPlayer.IsMuted = !audioPlayer.IsMuted;
        }
        
        private void OnVolumeChanged(object sender, 
            RoutedPropertyChangedEventArgs<double> e)
        {
            double volumeLevel = (double)(volumeSlider.Value / 10);
            audioPlayer.Volume = volumeLevel;
            lblVolumeLevel.Content = (double.Parse(volumeLevel.ToString("F2")) * 100) + "%";
        }
        
        private void OnDownloadClicked(object sender, RoutedEventArgs e)
        {
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.Filter = "オーディオファイル|*.wav";
            if (saveDialog.ShowDialog() == DialogResult.OK)
            {
                string destinationPath = saveDialog.FileName;
                System.IO.File.Copy(audioSourceUrl, destinationPath, true);
            }
        }
        
        private void OnCloseClicked(object sender, RoutedEventArgs e)
        {
            audioPlayer.Stop();
            audioPlayer.Close();
            this.MainLayout.Visibility = Visibility.Hidden;
        }
        
        private void OnMediaEnded(object sender, RoutedEventArgs e)
        {
            playbackStatus = "0";
        }
    }
}

主要機能の説明

このプレイヤーは以下の機能を提供します:

  • オーディオファイルの再生、一時停止、停止操作
  • 再生位置のシークバーによる制御
  • 音量調節とミュート機能
  • 再生進捗とダウンロード状況の表示
  • ファイルのローカル保存機能

タグ: Silverlight MediaElement XAML C# オーディオ再生

6月17日 23:31 投稿