У меня есть приложение, которое воспроизводит потоковые аудиоданные (например, чат-клиент). Рабочий процесс состоит из трех простых шагов:
- Сначала отправляется информация заголовка файла (частота дискретизации, биты на выборку и количество каналов).
- Устройство звукового волнового сигнала инициализируется на основе вышеуказанных параметров.
- Аудио (pcm) данные отправляются и воспроизводятся на вышеуказанном устройстве.
Код получения данных является собственным (код C). и он читает данные на сокете. Затем он вызывает управляемый код C #, который использует библиотеку Naudio для инициализации устройства и воспроизведения аудио.
Теперь проблема в том, что я вижу некоторую задержку при воспроизведении аудио. Я уже инструктировал остальную часть своего кода (в частности: передачу данных в сокет и передачу их обратно в управляемый код), и это, похоже, нормально. Весь процесс передачи занимает около 600 микросекунд, но после того, как я назначил буфер на Naudio
, он начинает воспроизводиться через некоторое время (около 200-250 миллисекунд).
Вот мой класс C #, который обрабатывает воспроизводящую аудио часть:
class foo
{
static IWavePlayer s_WaveOut;
static WaveFormat s_WaveOutFormat;
static BufferedWaveProvider s_WaveProvider;
static byte[] s_Samples = new byte[10000];
// called from native code to init deivce with specified sample rate and num of channels
private static void DeviceInit(int rate, int bits, int channels)
{
s_WaveOut = new WaveOut(WaveCallbackInfo.FunctionCallback());
s_WaveOutFormat = new WaveFormat(rate, bits, channels);
s_WaveProvider = new BufferedWaveProvider(s_WaveOutFormat);
s_WaveProvider.DiscardOnBufferOverflow = true;
s_WaveProvider.BufferLength = 5 * 1024 * 1024;
s_WaveOut.Init(s_WaveProvider);
s_WaveOut.Play();
}
// called from native 'C' code upon receiving audio packates
private unsafe static void PlayDataCallback(
IntPtr buff,
Int32 size)
{
Marshal.Copy(buff, s_Samples, 0, size);
s_WaveProvider.AddSamples(s_Samples, 0, size);
}
}
Кто-нибудь имеет представление о том, что может быть причиной задержки, или я использую ее (Наудио) каким-то неправильным образом.
Я пытался использовать ту же библиотеку Naudio для воспроизведения файла wav, и это, кажется, работает идеально, проблема возникает только тогда, когда я добавляю сэмплы после инициализации устройства самостоятельно.
[обновление] Если я изменю s_WaveOut = new WaveOut(WaveCallbackInfo.FunctionCallback());
на s_WaveOut = new DirectSound();
, производительность будет намного лучше. Если после этого я изменю источник Naudio для установки приоритета потока воспроизведения на Highest
(по умолчанию - Normal), производительность улучшится еще больше, но, как и ожидалось, процесс начнет потреблять большие ресурсы.
Спасибо,
Викрам