【问题标题】:Length in time of a wave file波形文件的时间长度
【发布时间】:2016-05-19 22:00:14
【问题描述】:

我有一些使用 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();
    }
}

一切正常,但在我开始播放波形文件之前我想知道它会持续多久。是否有某种计算方法,或者它在某处可用?

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

【问题讨论】:

  • 类似问题已在此处得到解答stackoverflow.com/questions/82319/…
  • 会有办法的,没有什么是不可能的。这个让我着迷。我会发布我的想法,如果我有什么想法 - 在那个事件中,我会夹着尾巴走到远方。
  • 正如链接文章中发布的那样,事先没有可靠的方法,但是 Genti 的解决方案是实现您的结果的好方法。有关长度计算的详细信息,请参阅 Genti 描述的评论。

标签: c# cscore


【解决方案1】:

如果有人在寻找解决方法,我会这样处理: (请原谅我的第一个 StackOverflow 评论)

  1. 我创建了 bool mouseScrewsAround = false
  2. 定时器事件,在播放时改变 trackBar 位置,仅在 !mouseScrewsAround 时触发
  3. trackBar_MouseDown -> mouseScrewsAround = true
  4. trackBar_MouseUp -> 改变轨道位置,然后 mouseScrewsAround = false

【讨论】:

    【解决方案2】:

    您可以使用CSCore 或NAudio:

    CSCore(提取自this sample,使用当前播放位置和总时长here):

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

    NAudio:

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

    另见the MSDN docs for TimeSpan。

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

    totalTimeInSeconds = LengthInBytes / AverageBytesPerSecond;
    

    【讨论】:

    • 他可以访问stream。合成器写入stream。
    • 我在发布后直接删除了我的评论,因为我在点击“添加”时看到了我的逻辑错误。对不起,我的朋友。
    • 谢谢。 “持续时间是根据 WAVE 数据的总长度(可以是压缩文件的估计值)和每秒平均字节数计算得出的” 我在哪里可以找到每秒的平均字节数?这是使用 CSCore。
    • 它在 WAV 文件头中,但我会看看如何在 CSCore 中做到这一点。
    • 在 CSCore 中您可以通过wavSource.WaveFormat.BytesPerSecond 获取它。
    【解决方案3】:
    using CSCore;
    
    IWaveSource waveSource = new WaveFileReader(stream);
    TimeSpan totalTime = waveSource.GetLength( ); //get length returns a timespan
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 2013-05-21
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      相关资源
      最近更新 更多