Обработка видео
[Функция, связанная с этой страницей, Медиаплеер Windows SDK, является устаревшей функцией. Он был заменен MediaPlayer. MediaPlayer оптимизирован для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует по возможности использовать MediaPlayer вместо пакета SDK для Медиаплеер Windows. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
Сведения об обработке видео зависят от формата; предоставление этих сведений выходит за рамки область данной документации. В общем смысле целью подключаемого модуля является изменение цветовых данных во входном буфере, а затем копирование данных в выходной буфер.
Пример подключаемого модуля обрабатывает два типа форматов видео: YUV и RGB.
Для видео YUV сведения о красном и синем цвете кодируются в значениях you и V, а уровень яркости представлен значением Y; зеленое значение закодировано и может быть восстановлено с помощью алгоритма. Пример подключаемого модуля просто изменяет значения you и V, чтобы повлиять на уровень цвета. Каждый байт U или V имеет значение от нуля до 255. Подключаемый модуль сначала корректирует каждое значение для представления в диапазоне от -128 до 127, а затем масштабирует значение на указанный коэффициент масштабирования. Наконец, код снова корректирует значение для исходного диапазона от нуля до 255 и копирует данные в выходной буфер. В следующем примере кода обрабатывается видео UYVY. В этом формате каждый другой байт является значением U или Y.
while( dwHeight-- )
{
DWORD x = dwWidth;
while( x-- )
{
// Scale the U and V bytes to 128.
// Just copy the Y bytes.
if( x%2 )
{
pbTarget[x] = pbSource[x];
}
else
{
long temp = (long)((pbSource[x] - 128) * m_fScaleFactor);
// Truncate if exceeded full scale.
if (temp > 127)
temp = 127;
if (temp < -128)
temp = -128;
pbTarget[x] = temp + 128;
}
}
// Move the pointers to the next row.
pbSource += lStrideIn;
pbTarget += lStrideOut;
}
Для видео RGB сведения о цвете и яркости кодируются в виде отдельных значений красного, зеленого и синего. Пример подключаемого модуля вычисляет среднее из трех значений, чтобы определить значение для серого, а затем корректирует каждое значение цвета с помощью предоставленного коэффициента масштабирования. Опять же, значения должны быть нормализованы для диапазона от -128 до 127 перед масштабированием. В следующем коде из Process32Bit показан процесс для RGB32:
while( dwHeight-- )
{
RGBQUAD* pPixelIn = (RGBQUAD*)pbSource;
RGBQUAD* pPixelOut = (RGBQUAD*)pbTarget;
for( DWORD x = 0; x < dwWidth; x++ )
{
// Get the color bytes.
long lBlue = (long) pPixelIn[x].rgbBlue;
long lGreen = (long) pPixelIn[x].rgbGreen;
long lRed = (long) pPixelIn[x].rgbRed;
// Compute the average for gray.
long lAverage = ( lBlue + lGreen + lRed ) / 3;
// Scale the colors to the average.
pPixelOut[x].rgbBlue = (BYTE)( ( lBlue - lAverage ) * m_fScaleFactor + lAverage );
pPixelOut[x].rgbGreen = (BYTE)( ( lGreen - lAverage ) * m_fScaleFactor + lAverage );
pPixelOut[x].rgbRed = (BYTE)( ( lRed - lAverage ) * m_fScaleFactor + lAverage );
pPixelOut[x].rgbReserved = pPixelIn[x].rgbReserved;
}
// Move the pointers to the next row.
pbSource += lStrideIn;
pbTarget += lStrideOut;
}
Дополнительные сведения о форматах видео см. на веб-сайте FourCC.
Связанные темы
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по