Как определить, находится ли образец, предоставленный VideoSink.OnSample (), правой стороной вверх? - PullRequest
2 голосов
/ 29 марта 2010

В настоящее время мы используем 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, т. Е. Если значение шага отрицательное, изображение будет быть с ног на голову. Однако мое собственное тестирование показывает, что если я не делаю что-то не так, это не так. По крайней мере, на моей собственной машине, независимо от того, является ли значение шага нулевым или отрицательным (единственные параметры, которые я вижу), выборочное изображение все еще перевернуто.

1 Ответ

2 голосов
/ 08 октября 2010

Я собирался предложить посмотреть VideoFormat.Stride , предоставленную в VideoSink.OnFormatChange , но затем я заметил ваше редактирование. Я пошел дальше и проверил его на своем компьютере разработчика, изображение перевернуто и шаг, как и ожидалось, отрицательный. Вы недавно проверили еще раз?

Несмотря на то, что шаг имел смысл для нативных приложений (использующих шаг при операциях с указателями), я согласен, что текущее поведение не то, что вы ожидаете от современного API. Как бы то ни было, лучше не вносить изменения в данные, полученные из нативного API.

Тем не менее, пока мы говорим о производительности, почему бы не предоставить образцы в форматах, отличных от PixelFormatType.Format32bppArgb , чтобы мы могли избежать преобразования цветового пространства? Кстати, есть свойство VideoCaptureDevice.DesiredFormat , которое работает только для разрешения, поскольку нет альтернативы PixelFormatType.Format32bppArgb.

...