none
wavファイルを範囲指定して再生する方法 RRS feed

  • 質問

  • Visual Studio上でwavフィアルを再生する方法で、SoundPlayerクラスを使用する手段が多く紹介されていますが、
    これだと単純にwavを再生、停止の方法しか見つかりませんでした。

    今回、wavの範囲を指定して再生する(10秒のwavファイルの内、2秒~3秒の間を再生する)方法を探しております。
    この場合、SoundPlayerクラスではなく、別のライブラリを導入するべきでしょうか?
    そもそもその方法がどこにもドキュメントとして残っておらず、どこから手を付けたら良いかわかりません・・・

    具体的に実現する方法、もしくはそのようなドキュメントがどこかに残っていれば、ぜひご教授お願いします。

    2015年10月17日 11:11

回答

  • こんにちは。

    以下を参考に試してみているところです。
    http://dobon.net/vb/dotnet/programing/playwavfile.html

    Windows Media Player Controlを使用する方法では開始時間を指定できたので
    厳密なシークは難しいかもしれませんが、時間を計測して止めれば疑似的に範囲指定した再生が出来るかもしれません。

    private void WMPLib_Call(string wavFilePath)
    {
        WMPLib.WindowsMediaPlayer mediaPlayer = new WMPLib.WindowsMediaPlayer();
        mediaPlayer.URL = wavFilePath;
        mediaPlayer.controls.currentPosition = 2;
        mediaPlayer.controls.play();
    }

    ほかの方法は調査中…。

    • 回答の候補に設定 星 睦美 2015年10月20日 2:11
    • 回答としてマーク 星 睦美 2015年10月27日 5:47
    2015年10月17日 14:46
    モデレータ
  • WPFのMediaElementを使ってもいいなら一応は範囲指定して再生はできます

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
        <DockPanel Background="Black">
            <Button Click="Button_Click" DockPanel.Dock="Bottom" >
                <TextBlock Text="▲">
                    <TextBlock.LayoutTransform>
                        <RotateTransform Angle="90"/>
                    </TextBlock.LayoutTransform>
                </TextBlock>
            </Button>
            <MediaElement x:Name="mediaElement1" />
        </DockPanel>
    </Window>
    Class MainWindow
        Private _StoryBoard As New System.Windows.Media.Animation.Storyboard()
        Private _TimeLine As New System.Windows.Media.MediaTimeline()
        Sub New()
            InitializeComponent()
    
            _StoryBoard.Children.Add(_TimeLine)
            System.Windows.Media.Animation.Storyboard.SetTarget(_TimeLine, mediaElement1)
    
        End Sub
        Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
            Dim dlg As New Microsoft.Win32.OpenFileDialog()
            dlg.Filter = "*.wav|*.wav"
            If (dlg.ShowDialog() = True) Then
    
                _TimeLine.Source = New Uri(dlg.FileName, System.UriKind.Absolute)
    
                _TimeLine.Duration = New Duration(TimeSpan.FromSeconds(3))
                _StoryBoard.Begin()
                _StoryBoard.Seek(TimeSpan.FromSeconds(2))
            End If
        End Sub
    End Class


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2015年10月20日 2:11
    • 回答としてマーク 星 睦美 2015年10月27日 5:47
    2015年10月17日 14:56

すべての返信

  • こんにちは。

    以下を参考に試してみているところです。
    http://dobon.net/vb/dotnet/programing/playwavfile.html

    Windows Media Player Controlを使用する方法では開始時間を指定できたので
    厳密なシークは難しいかもしれませんが、時間を計測して止めれば疑似的に範囲指定した再生が出来るかもしれません。

    private void WMPLib_Call(string wavFilePath)
    {
        WMPLib.WindowsMediaPlayer mediaPlayer = new WMPLib.WindowsMediaPlayer();
        mediaPlayer.URL = wavFilePath;
        mediaPlayer.controls.currentPosition = 2;
        mediaPlayer.controls.play();
    }

    ほかの方法は調査中…。

    • 回答の候補に設定 星 睦美 2015年10月20日 2:11
    • 回答としてマーク 星 睦美 2015年10月27日 5:47
    2015年10月17日 14:46
    モデレータ
  • WPFのMediaElementを使ってもいいなら一応は範囲指定して再生はできます

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
        <DockPanel Background="Black">
            <Button Click="Button_Click" DockPanel.Dock="Bottom" >
                <TextBlock Text="▲">
                    <TextBlock.LayoutTransform>
                        <RotateTransform Angle="90"/>
                    </TextBlock.LayoutTransform>
                </TextBlock>
            </Button>
            <MediaElement x:Name="mediaElement1" />
        </DockPanel>
    </Window>
    Class MainWindow
        Private _StoryBoard As New System.Windows.Media.Animation.Storyboard()
        Private _TimeLine As New System.Windows.Media.MediaTimeline()
        Sub New()
            InitializeComponent()
    
            _StoryBoard.Children.Add(_TimeLine)
            System.Windows.Media.Animation.Storyboard.SetTarget(_TimeLine, mediaElement1)
    
        End Sub
        Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
            Dim dlg As New Microsoft.Win32.OpenFileDialog()
            dlg.Filter = "*.wav|*.wav"
            If (dlg.ShowDialog() = True) Then
    
                _TimeLine.Source = New Uri(dlg.FileName, System.UriKind.Absolute)
    
                _TimeLine.Duration = New Duration(TimeSpan.FromSeconds(3))
                _StoryBoard.Begin()
                _StoryBoard.Seek(TimeSpan.FromSeconds(2))
            End If
        End Sub
    End Class


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2015年10月20日 2:11
    • 回答としてマーク 星 睦美 2015年10月27日 5:47
    2015年10月17日 14:56
  • ありがとうございます。再生位置はdoubleでミリ秒単位での指定も出来そうですね、これは助かります…!
    あとは停止の時間を計算できれば自分の求めている方法が実現できそうです。
    自分でも調べてみます!

    2015年10月18日 3:10
  • かなり無理やりですが、Timerコンポーネントを置いて、指定した秒数でTickイベントを発生させ再生を止める、という手段で無理やり範囲再生を実現しました…
    2015年10月23日 11:50
  • フォーラム オペレーターの星 睦美です。no title さん、こんにちは。

    今後も参考になる情報だと思いましたので、今回は私のほうで[回答としてマーク] させていただきました。
    それでは、ひきつづきフォーラムをよろしくお願いします。

    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年10月27日 5:49