NAudio - 从指定位置寻找和导航

时间:2012-04-29 11:27:37

标签: c# audio naudio

我在C#应用程序中使用NAudio库。我正试图寻找一个音频(* .mp3文件)到我想要的位置。 但是我没弄明白怎么做。

//Play the file starting from 16th second
waveStream.Seek(16, SeekOrigin.Begin);

而且......它几乎从一开始就开始播放,但不是从第16开始播出。我还找到了一个我认为正确的解决方案:

waveStream.Seek(waveStream.WaveFormat.AverageBytesPerSecond * 16, SeekOrigin.Begin);

这似乎更接近真相。我的决心是否真实?如果不是我该怎么办?

3 个答案:

答案 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);