В настоящее время мы используем Silverlight VideoSink для захвата видео с локальных веб-камер пользователей, примерно так:
protected override void OnSample(long sampleTime, long frameDuration, byte[] sampleData)
{
if (FrameShouldBeSubmitted())
{
byte[] resampledData = ResizeFrame(sampleData);
mediaController.SetVideoFrame(resampledData);
}
}
Теперь на большинстве машин, которые мы тестировали, образец видео, предоставленный в параметре byte [] sampleData, перевернут, т.е. если вы попытаетесь взять данные RGBA и превратить их, скажем, в WriteableBitmap, растровое изображение будет перевернутым. Это странно, но, конечно, довольно легко исправить - вам просто нужно перевернуть массив при его кодировании.
Проблема в том, что, по крайней мере, на некоторых машинах (например, на одном Macintosh в нашей тестовой среде) предоставленный образец видео больше не перевернут, а перевернут правой стороной вверх, и, следовательно, переворот изображения фактически приводит к получению изображения, которое получен в перевернутом виде на противоположной стороне.
Я сообщил об этом MS как об ошибке, но они (кратко) ответили, что это было «Как задумано». Дальнейшие попытки прояснения пока игнорируются.
Теперь я допускаю, что довольно интересно представить себе обсуждение этого дизайнерского решения: «Хорошо, просто чтобы было интересно, давайте проиграем видео правой стороной вверх на Mac, но давайте перевернем его вверх дном для Windows!» "Отличная идея!" «Да, это заставит тех разработчиков гадать!» Но помимо этого, я не могу найти эту, ммм, «особенность», задокументированную где-либо, и я не могу найти никакой документации о том, как можно определить, что данный образец видео перевернут или перевернут. Есть мысли, как это сказать?
РЕДАКТИРОВАТЬ 29.03.10, 16:50 - Я получил ответ от MS, в котором говорилось, что соответствующий способ определить это через свойство Stride объекта VideoFormat, то есть, если значение шага отрицательное, изображение будет перевернутым - вниз. Однако мое собственное тестирование показывает, что если я не делаю что-то не так, это не так. По крайней мере, на моей машине, независимо от того, равно ли значение шага нулю или отрицательно (единственные варианты, которые я вижу), изображение сэмпла все еще перевернуто.