Аппаратное ускорение декодирования с помощью OpenCV и Python в Windows (MSMT / IntelMFX / FFMPEG / любой бэкэнд) - PullRequest
0 голосов
/ 11 июня 2019

Я не могу заставить аппаратно-ускоренное декодирование работать с OpenCV в Windows 10.

Есть советы?Я уже скомпилировал и перепробовал все бэкэнды в последнем OpenCV 4.1.0 для Windows.

Я больше всего верил в декодирование MSMF, поскольку оно поддерживало поддержку DXVA.
(MSMF = Microsoft Media Foundation w/ DXVA)

Вот информация о сборке OpenCV.

getBuildInformation()
{
    Video I/O:
        DC1394:                      NO
        FFMPEG:                      YES (prebuilt binaries)
          avcodec:                   YES (58.35.100)
          avformat:                  YES (58.20.100)
          avutil:                    YES (56.22.100)
          swscale:                   YES (5.3.100)
          avresample:                YES (4.0.0)
        GStreamer:                   YES (1.16.0)
        DirectShow:                  YES
        Media Foundation:            YES
          DXVA:                      YES
        Intel Media SDK:             YES (.../x64/libmfx_vs2015.lib)
}

Вот мои результаты теста входного видео.

Results()
{
    Intel_MFX   
        [12.0x]     Frame: 12279/0      Speed: 224fps
        Elapsed:    58.081 s  <-- (Result Maxed CPU so it wasnt HWacclerated Decoding)

    FFMPEG  
        [9.4x]      Frame: 12400/12451  Speed: 170fps
        Elapsed:    74.809 s         <-- (Software Decoded, not HWacclerated)


    GSTREAMER
        [1.0x]      Frame: 1382/-1      Speed: 18fps
        Elapsed:    Realtime Video Playback

    MSMT
        ERROR OPENING WITH BACKEND
        Elapsed:    0.172 s

    DSHOW
        ERROR OPENING WITH BACKEND
        Elapsed:    0.002 s
}

Вот как я читаю вводфайл в Python

{
video=cv2.VideoCapture('input_video.264', cv2.CAP_INTEL_MFX )
video=cv2.VideoCapture('input_video.264', cv2.CAP_FFMPEG )
video=cv2.VideoCapture('input_video.264', cv2.CAP_GSTREAMER )
video=cv2.VideoCapture('input_video.264', cv2.CAP_MSMF )
video=cv2.VideoCapture('input_video.264', cv2.CAP_DSHOW )
}

Есть ли какой-нибудь более простой (HW Accelerated) способ получить кадры из видеофайла в OpenCV?Мне нужно анализировать каждый 18-й кадр (1 кадр в секунду) для отслеживания движения.Чем быстрее, тем лучше !!

Используя DXVA Checker, я смогу добиться скорости воспроизведения в режиме реального времени 800 кадров / с / ~ 40x с ускоренным декодированием Intel_CPU HW.(У меня также есть AMD AMD, но его HW ускоренная скорость декодирования SLOW @ 100fps / ~ 5x воспроизведения в реальном времени)

Есть ли альтернативный двоичный файл FFMPEG, который я могу скомпилировать, который вызывает HW Decoding?Я знаю, что FFMPEG поддерживает ускорение HW!

...