Как выглядит поток байтов из VideoSink.OnSample? - PullRequest
1 голос
/ 17 мая 2011

В Silverlight для получения необработанных данных с веб-камеры используется метод VideoSink.OnSample.Сигнатура функции выглядит следующим образом:

protected abstract void OnSample(
    long sampleTimeInHundredNanoseconds,
    long frameDurationInHundredNanoseconds,
    byte[] sampleData
)

Документация для sampleData говорит

Поток байтов, который содержит видеоданные.Поток байтов должен быть обработан в сэмплы согласно соответствующей информации о формате видео.

Если обратиться к документации по классу VideoFormat, можно получить VideoFormat.PixelFormat свойство, которое может иметь только два возможных значения согласно документации :

  • Неизвестно - Формат неизвестен.
  • Format32bppArgb - формат использует 32-битную информацию о цвете на пиксель и сообщает информацию о цвете, используя альфа-канал, красный, синий и зеленый.* Я хочу понять, как выглядит параметр sampleData для метода VideoSink.OnSample.Это просто массив пикселей, подобный приведенному ниже?
    sampleData[0] = image[x = 0, y = 0].R;
    sampleData[1] = image[x = 0, y = 0].G;
    sampleData[2] = image[x = 0, y = 0].B;
    sampleData[3] = image[x = 0, y = 0].A;
    sampleData[4 to 7] = image[x = 0, y = 1];
    sampleData[8 to 11] = image[x = 0, y = 2];
    sampleData[4*Height-4 to 4*Height-1] = image[x = 0, y = Height];
    sampleData[4*Height to 4*Height+3] = image[x = 1, y = 0];
    // ...
    

    Если это так просто: правильный ли порядок?

    • R перед G перед B перед A для A для каждого пикселя
    • Все пиксели первого столбца перед всеми пикселями второго столбца и т. Д.

1 Ответ

1 голос
/ 18 мая 2011

Поток байтов для пиксельного формата Format32bppArgb выглядит следующим образом:

sampleData[0- 3] = image[x=0, y=0]
sampleData[4- 7] = image[x=1, y=0]
sampleData[8-11] = image[x=2, y=0]
      ...                ...
                   image[x=w, y=0]
                   image[x=0, y=1]
                         ...
                   image[x=w, y=h]

Итак, он хранится построчно.

Для каждого пикселя, который хранится в байтах i до i + 3 информация выглядит следующим образом:

sampleData[i+0] = BLUE
sampleData[i+1] = GREEN
sampleData[i+2] = RED
sampleData[i+3] = ALPHA

Все каналы сохраняются как целые числа в диапазоне [0; 255], где 255 указывает максимальную интенсивность для цветовых каналов и непрозрачный для альфа-канала. Так что, кроме порядка, он работает как ожидалось.

...