어떻게 효율적으로 렌더링하고 프로세스 비디오 스트림을 사용하여 GPU?

StackOverflow https://stackoverflow.com/questions/480460

  •  20-08-2019
  •  | 
  •  

문제

내 계획을 개발하기 위한 도구하는 실시간 비디오를 조작을 사용하여 C++,Qt 및 OpenGL.동영상 오버레이는 옵션을 하지 않기 때문이더에 사용되어야 프레임 처리합니다.순간에 저는 상상해 다음과 같은 시퀀스의 단계:

  1. 비디오를 디코딩(CPU)
  2. 그것은 전처리(옵션,CPU)
  3. Transer 게 비디오 메모리(GPU 를 사용하여 DMA)
  4. 한 프로세스를 사용하여 그것을 꼭짓점 및 조각이더(GPU)
  5. 렌더링(GPU)

내가 찾는 몇 가지 일반적인 조언 explaning 무엇 extentions 이나 기술을 여기에서 사용할 수 있습니다.은 거기에 좋은 이유는 Direct3D 를 사용하는 대신?

도움이 되었습니까?

해결책

첫째, PC에는 DMA를 사용하는 명백한 방법이 없습니다. 운전자 ~할 것 같다 그것을 사용하거나 다른 것을 사용할 수 있습니다.

어쨌든 3 단계는 "그래픽 카드의 텍스처 데이터 변경"입니다. OpenGL에서는 PBO (픽셀 버퍼 객체) 확장자 또는 좋은 오래된 gltexsubimage* 함수입니다. D3D9에서는 텍스처 또는 다른 방법으로 잠금됩니다 (예 : 스크래치 텍스처에서 잠금 한 다음 GPU 텍스처로 섞 으세요). 그 중 어느 누구도 잠재적으로 DMA를 사용하지만 확실하지 않습니다.

그런 다음 데이터가 텍스처에 있습니다. 일부 셰이더 (예 : YCBCR 변환)가있는 화면으로 렌더링하거나 다른 텍스처로 렌더링하여보다 복잡한 처리 효과 (예 : Blur/Glow/...)를 수행 할 수 있습니다.

Direct3D를 사용하는 것은 일을하는 "낭비"가 명확하게 정의된다는 의미에서 더 쉽습니다. OpenGL에는 무엇이든 할 수있는 더 많은 옵션이 있으며, 어떤 것이 빠른지 알아 내야합니다 (때로는 빠른 경로가 플랫폼이나 하드웨어에서 다릅니다).

다른 팁

당신은 리눅스,NVIDIA 의 최근 드라이버 180 입니다.xx 시리즈에 추가한 지원을 위한 비디오를 디코딩을 통해 VDPAU api(비디오를 디코딩 및 프레젠테이션 뭔가).많은 주요 프로젝트가 통합된 api 를 포함하여 mplayer,vlc,ffmpeg,그리고 라이브러리.나는 모두 알지 못하는 구체적인,하지만 그들이 제공하는 api 를 위한 많은 코덱을 포함하여 일반적인 하위 작업과 비트 스트림습니다.

내가 보기에 가기 전에 바로 CUDA(나는 가정 VDPAU 사용할 수 있습)

CPU에서 GPU로 프레임 데이터를 전송하려면 PBO에스. 확인하다 이것 또한.

또한 어쨌든 셰이더를 사용하는 경우 Fragment Shaders (YCBCR에서 RGB)에서 Colorspace 변환을 수행하여 CPU 부담을 완화 할 수 있습니다.

"추가 처리"및 "렌더링"단계는 일반적으로 거의 동일하고 셰이더에서 멋진 작업을 수행하고 프레임 버퍼에 혼합합니다. 비디오와 다른 효과를 혼합하고 일치 시키려면 FBOS도 유용합니다.

에 대한 대안으로 당신이 볼 수 있는 몇 가지의 다른 언어를 수행에 대한 일반적인 목적 GPU 프로그래밍(GPGPU)등 CUDA 에서 NVIDIA 또는 스트림에서 SDK ATI.에 따라,당신이 선택할 수 있습에 자신을 제한 하나의 브랜드 Gpu,하지만.를 사용하는 이유는 이러한 언어 작동하는 것의 수준에서 추상화에 가까운 정상적인 높은 수준의 프로그래밍을 대신의 작업이더.

경험을가지고 있으로 무엇을 하고 싶어 그래서 내가 말할 수 없는 경우 쉐이 실제로 더 적합한 작업을 하지만 그것은 무언가를 고려할 수 있습니다.라고 말할 수 있는 알고리즘 디자인은 여전히 다소 다른 일반적인 코드고 몇 가지 노력이 걸립니다(나만과 일 CUDA 하지만 그들은 모든 것을 사용하여 비슷한 추상화).

나급이 부여한 경우 상당한 금액의 경험으로 셰이 작동 되지 않을 수도 있습니다움 할 가치가있을 위해 당신 배우 새로운 플랫폼입니다.

다음 단계는이를 수행해야합니다.

  1. 비디오를 yuv로 디코딩합니다

    이것은 일반적으로 디코더 libs가하는 일입니다.

  2. 텍스처로 OpenGL에로드하십시오

  3. yuv를 RGB로 변환하십시오

    오버레이를 사용하고 싶지 않으므로 수동으로 변환해야합니다. 여기 셰이더를 사용하는 예입니다.

  4. 변환 된 텍스처를 쿼드에 넣고 화면으로 렌더링합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top