如何获取mp3文件的持续时间而不播放或存储它们

时间:2014-01-30 19:40:16

标签: c# windows-phone-8

我正在构建一个可以在列表框中逐行播放诗歌的wp8应用程序。

假设我有20行诗歌在列表框中显示为20个项目。我有20个mp3文件(每行一个),我使用BackgroundAudioPlayer播放单个文件并选择列表框中的每个项目(诗)。在播放这些mp3文件的过程中,有1-3秒的延迟,所以我发现这些mp3文件的完整版本(20个文件合并为一个),逐行阅读诗歌。

我正在使用BackgroundAudioPlayer播放这个mp3文件。作为一个文件播放,我无法选择列表框中的每个项目,因为我不知道播放一个mp3文件的行号。

现在我想要的是在几秒钟内存储20个文件的持续时间,而无需存储和播放。这些文件位于链接(http:123.com/1.mp3,/2.mp3,...)

我使用了具有绝对路径的AudioTrack,然后使用了duration属性,但它总是返回零。如何在不播放的情况下获取mp3文件的持续时间?

编辑: 在后面的代理我做了以下:

protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
{
switch (playState)
{
case PlayState.TrackReady:
TrackDuration tr = DataSource.Connection.Table<TrackDuration>().SingleOrDefault();
if (tr.IsGetTrackDuration)
{
if (player.Track != null)
{
player.Position = TimeSpan.FromSeconds(player.Track.Duration.TotalSeconds);
Recitation r = DataSource.Connection.Query<Recitation>("select * from Recitation where ID = " + player.Track.Title).SingleOrDefault();
r.AyaDuration = player.Track.Duration.TotalSeconds;
DataSource.saveRecitionDownloaded(r);
PlayNextTrack(player);
}
}
break;
}
NotifyComplete();
}

protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
{
switch (action)
{
case UserAction.Play:
   PlayTrack(player);
break;
case UserAction.Seek:
if (null!=player.Track)
player.Position = (TimeSpan)param;
break;
}
NotifyComplete();
}

private void PlayNextTrack(BackgroundAudioPlayer player)
{
 if (++currentTrackNumber >= audioTrack.Count)
   return;
 PlayTrack(player);
}

private void PlayTrack(BackgroundAudioPlayer player)
{
//If No Track then load Track
 if (audioTrack.Count == 0)
 {
     //Load Tracks and Add them into Track Play List
 }
if ((player.Track == null) || (player.Track.Title != audioTrack[currentTrackNumber].Title))
    player.Track = audioTrack[currentTrackNumber];

if ((player.Track != null) && (player.PlayerState != PlayState.Playing))
    player.Play();
}

问题是它播放了一些我不想要的文件。 (tr.IsGetTrackDuration)总是如此,但我不知道它为什么会播放一些?

2 个答案:

答案 0 :(得分:1)

MusicProperties类具有持续时间的属性

 MusicProperties musicProperties = await file.Properties.GetMusicPropertiesAsync();
 outputText.AppendLine("Duration: " + musicProperties.Duration);

答案 1 :(得分:0)

好的我在这里有个想法。在AudioPlayer类下,有一个TrackReady事件,默认设置为播放轨道。如果你只想获得持续时间,而不是默认播放,如果你真的想要播放音乐,那么将bool设置为true;如果你想播放完整的mp3,则设置为false。

在设置曲目之前,必须在主应用中设置bool值,然后在每次调用OnPlayStateChanged时在AudioPlayer中读取。

protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
{
    //read GettingDuration value here

    try
    {
        switch (playState)
        {
            case PlayState.TrackReady:
                if (GettingDuration)
                {
                //store duration somehow and get the next track in line
                }
                else
                {
                    player.Play();
                }

                break;
        }
    }
}