波形文件的时间长度

本文关键字:时间 文件 波形 | 更新日期: 2023-09-27 18:33:51

>我有一些简单的代码,使用 TTS 生成一个波形文件,然后播放它:

public void TestSpeech()
{
    SpeechSynthesizer synth = new SpeechSynthesizer();
    using (MemoryStream stream = new MemoryStream())
    {
        synth.SetOutputToWaveStream(stream);
        synth.Speak("Hello world");
        stream.Seek(0, SeekOrigin.Begin);
        IWaveSource source = new WaveFileReader(stream);
        EventWaitHandle waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset);
        var soundOut = new WasapiOut();
        soundOut.Initialize(source);
        soundOut.Stopped += (s, e) => waitHandle.Set();
        soundOut.Play();
        waitHandle.WaitOne();
        soundOut.Dispose();
        source.Dispose();
    }
}

一切正常,但我想知道在开始播放 wave 文件之前它会持续多长时间。 有没有某种计算方法,或者它在某个地方可用?

如果它在某处可用,它是如何计算的? 我假设它与流中的数据量有关,但是如何呢?

波形文件的时间长度

您可以使用CSCore或NAudio:

CSCore(从此示例中提取,此处使用当前播放位置和总持续时间):

using System;
using CSCore;
using CSCore.Codecs.WAV;
IWaveSource wavSource = new WaveFileReader(stream);
TimeSpan totalTime = wavSource.GetLength();

瑙迪奥

using System;
using NAudio.Wave;
using (var wfr = new WaveFileReader(stream))
{
    TimeSpan totalTime = wfr.TotalTime;
}

另请参阅 TimeSpan 的 MSDN 文档。

持续时间是根据 WAVE 数据的总长度(可以是压缩文件的估计值)和每秒平均字节数(根据属性 TotalTime 中的 NAudio 源)计算得出的:

totalTimeInSeconds = LengthInBytes / AverageBytesPerSecond;
using CSCore;
IWaveSource waveSource = new WaveFileReader(stream);
TimeSpan totalTime = waveSource.GetLength( ); //get length returns a timespan

如果有人正在寻找解决方法,我像这样处理它:(请原谅我的第一个堆栈溢出评论)

  1. 我创建了布尔鼠标螺丝周围 = 假
  2. 计时器事件,在播放时更改 trackBar 位置,仅在 !mouseScrewsAround 时触发
  3. trackBar_MouseDown ->鼠标螺丝周围 = 真
  4. trackBar_MouseUp -> 更改轨道位置,则鼠标螺丝周围 = 假