Обнаружение громкости или тишины в Media Foundation

Я работаю над разработкой медиаплеера на базе платформы Microsoft Media Foundation. Для бесперебойной работы программы жизненно важно, чтобы она могла делать две вещи: обнаруживать любую паузу в начале или конце файла и выполнять нормализацию аудиофайла. Обе эти вещи будут включать определение «громкости» или «громкости».

Основываясь на исследованиях, которые я провел до сих пор, это будет включать использование IMFSourceReader для извлечения всех объектов IMFMediaSample, а затем для каждого образца извлечение любых и всех объектов IMFMediaBuffer.

После блокировки буфера у меня будет байт данных, содержащихся в нем. Как мне интерпретировать эти данные таким образом, чтобы определить «громкость», а затем манипулировать данными для регулировки громкости?


person Michael Buckman    schedule 12.08.2014    source источник


Ответы (1)


Чтобы проанализировать файл, вам просто нужно создать читатель исходного кода для файла, а затем читает каждый аудиосэмпл.

Чтобы изменить значения в файле, есть два варианта, в зависимости от того, что вы хотите сделать.

Вы можете создать MFT и используйте его в MediaSession для изменения значений во время воспроизведения или транскодирования.

Или вы можете просто внедрить код в свою программу и изменить значения, полученные из исходного кода (например, в режиме анализа), и записать их в запись приемника. В обоих вариантах вы работаете с буферами IMFSample.

person CPlusSharp    schedule 13.08.2014
comment
После блокировки IMFMediaBuffer у меня будет байт данных, содержащихся в нем. Как мне интерпретировать эти данные с точки зрения объема или громкости? Каким образом я могу рассчитать новое значение громкости на основе данных? - person Michael Buckman; 14.08.2014
comment
Формат байтов в образце зависит от Mediatype. Описание PCM можно найти на странице MSDN. - person CPlusSharp; 14.08.2014
comment
Итак, чтобы использовать пример и проверить мое понимание, давайте возьмем формат файла MP3. Каждый образец или кадр MP3 имеет заголовок размером 32 бита (или четыре байта). Если бы я проигнорировал первые четыре байта IMFMediaSample и его буферов, а оставшиеся байты в образце были бы моими аудиоданными, правильно? - person Michael Buckman; 15.08.2014
comment
Я бы работал с необработанными данными PCM. Если у вас есть MP3 Audio, вам нужно сначала его декодировать. Если вы используете Source Reader или MFT, вы можете настроить его так, чтобы получать декодированные данные. Затем в потоке PCM у вас есть байтовые данные, как описано в ссылке MSDN в моем последнем комментарии. - person CPlusSharp; 15.08.2014
comment
Таким образом, используя необработанные данные PCM в качестве основы, вы, по сути, создаете общий знаменатель и устраняете необходимость в знаниях о различных форматах, верно? - person Michael Buckman; 15.08.2014