Эти сегменты могут иметь разные начало, длину и скорость воспроизведения, как и любой аудио-/видеоредактор.
Я пытаюсь реализовать воспроизведение звука этих аудиосегментов с помощью NAudio.
Вот как я инициализирую необходимые помощники:
Код: Выделить всё
public EditorViewModel()
{
_outputDevice = new WaveOutEvent();
_mixer = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(48000, 2))
{
ReadFully = true
};
_bufferedWaveProvider = new BufferedWaveProvider(_mixer.WaveFormat);
_outputDevice.Init(_bufferedWaveProvider);
}
Код: Выделить всё
private void MixAudioTracks()
{
_mixer.RemoveAllMixerInputs();
foreach (var track in Tracks)
{
foreach (var segment in track.Segments)
{
var inputStream = new AudioFileReader(segment.AudioPath)
{
Volume = segment.Volume
};
var offsetStream = new OffsetSampleProvider(inputStream.ToSampleProvider())
{
DelayBy = TimeSpan.FromTicks(segment.StartTime),
SkipOver = TimeSpan.FromTicks(segment.StartTimeOffset),
Take = TimeSpan.FromTicks(segment.Length - segment.EndTimeOffset)
};
_pitchSampleProvider = new SmbPitchShiftingSampleProvider(offsetStream)
{
PitchFactor = segment.SpeedFactor / SpeedFactor //Segment vs previewer speed
};
_mixer.AddMixerInput(_pitchSampleProvider);
}
}
var floatBuffer = new float[_bufferedWaveProvider.BufferLength / 4];
var bytesRead = _mixer.Read(floatBuffer, 0, floatBuffer.Length);
//Convert float array to byte array
var byteBuffer = new byte[bytesRead * 4]; //4 bytes per float
Buffer.BlockCopy(floatBuffer, 0, byteBuffer, 0, byteBuffer.Length);
_bufferedWaveProvider.AddSamples(byteBuffer, 0, byteBuffer.Length);
}
Это похоже, в NAudio нет встроенных функций поиска или позиционирования.
Подробнее здесь: https://stackoverflow.com/questions/793 ... apabilitie