Разработка Аудио Фильтра для DirectShow в Delphi: Работа с PCM-Форматом и WaveFormatEx
Вопрос разработчика, использующего Delphi 6 Pro совместно с компонентной библиотекой DSPACK DirectShow, заключается в правильной настройке параметра MediaType при вызове функции GetMediaType() для фильтра, который передает данные в формате WAV из пользовательского аудио источника. Основная проблема состоит в том, что необходимо корректно установить значения для полей majortype, subtype и formattype структуры MediaType.
Шаги по решению вопроса:
Установка значений для majortype, subtype и formattype:
majortype должен быть установлен в значение MEDIATYPE_Audio.
subtype обычно представляет собой код FOURCC, преобразованный в GUID. В случае с аудио данными рекомендуется использовать MEDIASUBTYPE_PCM, так как он является стандартным типом для передачи несжатых аудиоданных.
formattype должен быть установлен в значение FORMAT_WaveFormatEx.
Выделение памяти для структуры WaveFormatEx и копирование данных из объекта TWaveFile:
Используйте функцию CoTaskMemAlloc() для выделения памяти под структуру WaveFormatEx.
Скопируйте данные из structures TWaveFormatEx объекта TWaveFile в выделенную память.
Заполнение поля pbFormat указателем на выделенный блок данных с форматом и установка размера этого блока в cbFormat:
Установите поле pbFormat структуры MediaType в указатель на только что созданный объект WaveFormatEx.
Размер данных формата (без учета дополнительных байтов) должен быть передан в поле cbFormat.
Обработка поля lSampleSize:
Поле lSampleSize должно содержать количество байт, необходимых для хранения одного семпла аудиосигнала всех каналов.
Установка остальных параметров MediaType:
Флаг bTemporalCompression должен быть установлен в False, так как данные не сжимаются.
Флаг bFixedSizeSamples должен быть установлен в True, так как размер каждого семпла фиксирован.
Освобождение ресурсов при необходимости:
Помните о том, что если вы выделили память для поля pbFormat, её необходимо освободить с помощью CoTaskMemFree(), например, при уничтожении объекта фильтра.
Пример кода на Object Pascal (Delphi):
function TMyAudioFilter.GetMediaType(MediaType: PAMMediaType): HResult;
begin
// Выделение памяти для структуры WaveFormatEx
MediaType.pbFormat := CoTaskMemAlloc(SizeOf(TWaveFormatEx));
try
// Копирование данных из объекта TWaveFile в выделенную память
with FWaveFile.WaveFormatEx do
CopyTo(@MediaType.pbFormat^, SizeOf(TWaveFormatEx));
// Установка остальных параметров MediaType
MediaType.majortype := MEDIATYPE_Audio;
MediaType.subtype := MEDIASUBTYPE_PCM;
MediaType.formattype := FORMAT_WaveFormatEx;
MediaType.bTemporalCompression := False;
MediaType.bFixedSizeSamples := True;
MediaType.lSampleSize := nChannels * (wBitsPerSample div 8);
// Установка размера данных формата в cbFormat
MediaType.cbFormat := SizeOf(TWaveFormatEx);
// Остальные настройки...
except
on E: Exception do
// Освобождение памяти при возникновении исключения
CoTaskMemFree(MediaType.pbFormat);
raise;
end;
end;
Заключение
При разработке аудио фильтра для DirectShow важно правильно установить параметры MediaType, особенно когда работа идет с несжатыми PCM-форматами. Следуя приведенным шагам, можно избежать распространенных ошибок, связанных с неправильной конфигурацией форматов данных между фильтрами в графе DirectShow.
Разработка аудио фильтра для DirectShow в Delphi, работающего с PCM-форматом и WaveFormatEx.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.