Как определить, находится ли образец, предоставленный VideoSink.OnSample (), правой стороной вверх?

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


person Ken Smith    schedule 29.03.2010    source источник


Ответы (1)


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

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

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

person orcun    schedule 08.10.2010
comment
Я не тестировал это в последнее время (поддержка Mac пока что отошла на второй план), но я буду. Что я помню, когда я это тестировал, так это то, что я получил перевернутое изображение, независимо от того, был ли шаг нулевым или отрицательным. Но я проверю еще раз в какой-то момент. Я также согласен с тем, что API веб-камеры и микрофона Silverlight довольно примитивны. В настоящий момент я сталкиваюсь с рядом проблем, связанных с тем, что Silverlight не исправляет проблемы синхронизации с некоторыми звуковыми картами (т.е. в соответствии с системными часами они отправляют или запрашивают образцы каждые 20,5 мс, а не каждые 20 мс). Тьфу. - person Ken Smith; 16.10.2010
comment
Наконец-то я решил исправить нашу поддержку Mac. Оказывается, если шаг ›0, изображение находится справа вверх. Если шаг равен ‹= 0, изображение перевернуто. Это не совсем то, что говорят документы, но, похоже, работает надежно. - person Ken Smith; 08.12.2010