我在C#应用程序中使用NAudio库。我正试图寻找一个音频(* .mp3文件)到我想要的位置。 但是我没弄明白怎么做。
//Play the file starting from 16th second
waveStream.Seek(16, SeekOrigin.Begin);
而且......它几乎从一开始就开始播放,但不是从第16开始播出。我还找到了一个我认为正确的解决方案:
waveStream.Seek(waveStream.WaveFormat.AverageBytesPerSecond * 16, SeekOrigin.Begin);
这似乎更接近真相。我的决心是否真实?如果不是我该怎么办?
答案 0 :(得分:7)
您可以直接在Position
上设置WaveStream
,必须将其转换为字节偏移量 - 所以是的,将每秒平均字节数乘以秒数就可以到达正确的位置(至少使用普通的PCM WAV文件)。 WaveStream
还有一个名为CurrentTime
的辅助属性,允许您使用TimeSpan
并为您执行相同的计算。
答案 1 :(得分:6)
如果有人仍然有这个问题而且无法理解。 然后这是一个例子:
myWaveStream.CurrentTime = myWaveStream.CurrentTime.Add(new TimeSpan(0, hours, minutes, seconds, milliseconds));
myWaveStream.CurrentTime = myWaveStream.CurrentTime.Subtract(new TimeSpan(0, hours, minutes, seconds, milliseconds));
答案 2 :(得分:0)
我使用trackBar创建了一个导航,该导航条每秒具有4个滴答声(250ms处有1个滴答声):
// Generated by using Rcpp::compileAttributes() -> do not edit by hand
// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393
#include <Rcpp.h>
using namespace Rcpp;
// read_header
MY_HEADER_INFO read_header();
RcppExport SEXP _myPackage_read_header() {
BEGIN_RCPP
Rcpp::RObject rcpp_result_gen;
Rcpp::RNGScope rcpp_rngScope_gen;
rcpp_result_gen = Rcpp::wrap(read_header());
return rcpp_result_gen;
END_RCPP
}
static const R_CallMethodDef CallEntries[] = {
{"_myPackage_read_header", (DL_FUNC) &_myPackage_read_header, 0},
{NULL, NULL, 0}
};
RcppExport void R_init_myPackage(DllInfo *dll) {
R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);
R_useDynamicSymbols(dll, FALSE);
}
在每250毫秒调用一次的计时器滴答处理程序中,跟踪栏的更新如下:
trackBar1.Maximum = (int)stream.TotalTime.TotalSeconds * 4;
为了设置位置(滚动后),此公式起作用:
double ms = stream.Position * 1000.0 / output.OutputWaveFormat.BitsPerSample / output.OutputWaveFormat.Channels * 8.0 / output.OutputWaveFormat.SampleRate;
trackBar1.Value = (int) (4 * ms / 1000);