gpt4 book ai didi

c# - 如何使用 WPF 中的 MediaPlayer 编写一个方法来打开、开始播放,然后返回音频文件的持续时间?

转载 作者:行者123 更新时间:2023-11-30 19:52:08 24 4
gpt4 key购买 nike

下面很明显我想做什么,但是我得到以下异常:

Unable to return a TimeSpan property value for a Duration value of 'Automatic'.

看到那篇我很气馁

NaturalDuration cannot be determined until after MediaOpened has occurred. (link)

这是否意味着我必须想出一个人为的方法来打开文件,在单独的线程中等待媒体打开事件,然后仅在事件触发后才返回持续时间?

    public static int PlayAudio(string fileName)
{
try
{
myMediaPlayer.Stop();
myMediaPlayer.Close();
myMediaPlayer.Open(new Uri(filename));
myMediaPlayer.Play();
return myMediaPlayer.NaturalDuration.TimeSpan.Milliseconds;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return -1;
}
}

最佳答案

I have to come up with a contrived method to open the file, wait for the media opened event in a separate thread, then return the duration only after the event has fired

不幸的是,这正是它的意思。以下是我为此想到的:

using System;
using System.Threading;
using System.Windows.Media;
using System.Windows.Threading;

class Program
{
static void Main(string[] args)
{
var mediaFile = @"c:\path\to\mediafile.mp3";
var duration = GetMediaDuration(mediaFile, TimeSpan.FromMilliseconds(500));
Console.WriteLine(duration.ToString());
Console.ReadKey();
}

static TimeSpan GetMediaDuration(string mediaFile)
{
return GetMediaDuration(mediaFile, TimeSpan.Zero);
}

static TimeSpan GetMediaDuration(string mediaFile, TimeSpan maxTimeToWait)
{
var mediaData = new MediaData() {MediaUri = new Uri(mediaFile)};

var thread = new Thread(GetMediaDurationThreadStart);
DateTime deadline = DateTime.Now.Add(maxTimeToWait);
thread.Start(mediaData);

while (!mediaData.Done && ((TimeSpan.Zero == maxTimeToWait) || (DateTime.Now < deadline)))
Thread.Sleep(100);

Dispatcher.FromThread(thread).InvokeShutdown();

if (!mediaData.Done)
throw new Exception(string.Format("GetMediaDuration timed out after {0}", maxTimeToWait));
if (mediaData.Failure)
throw new Exception(string.Format("MediaFailed {0}", mediaFile));

return mediaData.Duration;
}

static void GetMediaDurationThreadStart(object context)
{
var mediaData = (MediaData) context;
var mediaPlayer = new MediaPlayer();

mediaPlayer.MediaOpened +=
delegate
{
if (mediaPlayer.NaturalDuration.HasTimeSpan)
mediaData.Duration = mediaPlayer.NaturalDuration.TimeSpan;
mediaData.Success = true;
mediaPlayer.Close();
};

mediaPlayer.MediaFailed +=
delegate
{
mediaData.Failure = true;
mediaPlayer.Close();
};

mediaPlayer.Open(mediaData.MediaUri);

Dispatcher.Run();
}
}

class MediaData
{
public Uri MediaUri;
public TimeSpan Duration = TimeSpan.Zero;
public bool Success;
public bool Failure;
public bool Done { get { return (Success || Failure); } }
}

关于c# - 如何使用 WPF 中的 MediaPlayer 编写一个方法来打开、开始播放,然后返回音频文件的持续时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/423373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com