C# 波形文件的时间长度
我有一些简单的代码,使用TTS生成一个wave文件,然后播放:C# 波形文件的时间长度,c#,cscore,C#,Cscore,我有一些简单的代码,使用TTS生成一个wave文件,然后播放: public void TestSpeech() { SpeechSynthesizer synth = new SpeechSynthesizer(); using (MemoryStream stream = new MemoryStream()) { synth.SetOutputToWaveStream(stream); synth.Speak("Hello world
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(从中提取,使用当前播放位置和总持续时间):
诺迪奥:
using System;
using NAudio.Wave;
using (var wfr = new WaveFileReader(stream))
{
TimeSpan totalTime = wfr.TotalTime;
}
另见
持续时间根据波形数据的总长度(可以是压缩文件的估计值)和平均每秒字节数(根据in属性TotalTime
)计算得出:
如果有人在寻找解决办法,我会这样处理: (请原谅我的第一句话)
类似的问题已经在这里得到了回答,会有办法的,没有什么是不可能的。这个让我着迷。如果我有什么想法,我会发布我的想法——在那次活动中,我会两腿夹着尾巴走到远处。正如链接文章中所发布的,之前没有可靠的方法可以做到这一点,但是Genti的解决方案是实现你的结果的好方法。有关长度计算的详细信息,请参见Genti描述中的注释。不过,他可以访问
流
。合成器写入流
。我在发布后直接删除了我的评论,因为我在单击“添加”时看到了我的逻辑错误。对不起,朋友,谢谢你。“持续时间是根据波形数据的总长度(可以是压缩文件的估计值)和平均每秒字节数计算的”我在哪里可以找到平均每秒字节数?这是在使用CSCore。它位于WAV文件头中,但我将了解如何在CSCore中实现这一点。在CSCore中,您可以使用wavSource.WaveFormat.BytesPerSecond
获得它。
using System;
using NAudio.Wave;
using (var wfr = new WaveFileReader(stream))
{
TimeSpan totalTime = wfr.TotalTime;
}
totalTimeInSeconds = LengthInBytes / AverageBytesPerSecond;
using CSCore;
IWaveSource waveSource = new WaveFileReader(stream);
TimeSpan totalTime = waveSource.GetLength( ); //get length returns a timespan