RTSP 영상은 어떤 콤포넌트를 쓰시나요?

안녕하세요.

WPF에서 RTSP에서 CCTV 영상을 스트림해서 표출하고 있는데요. 2-3개만 띄워도 버벅거리고
성능이 너무 안좋습니다. 여러개를 그리드로 20-30개 표출하고 싶은데 선배님들은 어떤방식으로
RSTP를 스트리밍해서 영상을 표출하시나요?

저는 GitHub - ZeBobo5/Vlc.DotNet: .NET control that hosts the audio/video capabilities of the VLC libraries 의 오픈소스를 사용하고 있습니다.

좋아요 2

예전이라 기억이 잘 안나는데…

Simple Rtsp client
수신 받고 Ffmpeg로 디코딩한 다음에 WPF의 Image Control로 뿌렸습니다.
(고로 음성 없음)

한 Window 창에서 9개 영상 실시간 스트리밍으로 띄웠는데 동작에 전혀 무리 없었습니다.

더 최적화된 영상 렌더링을 원하신다면 Windows에서 지원하는 고성능 그래픽 엔진을 쓰셔야할 듯 합니다.

좋아요 5

감사합니다. 한번 테스트 해봐야겠습니다.!

좋아요 3

참고로 ffmpeg을 사용하신다면, 라이선스에 관련된 부분을 주의 깊게 보셔야 합니다. 기본적으로 ffmpeg 자체는 LGPL 2.1을 따르지만, GPL로 배포되는 코덱을 사용해야 할 경우 문제가 복잡할 수 있습니다.

https://www.ffmpeg.org/legal.html

좋아요 4

성능문제가 있다고 하셨는데… 일단 VLC 플레이어로 CCTV 영상을 몇 개까지 띄울수 있는지 시험부터 해보세요.
VLC 플레이어가 RTSP 플레이어 중에 테스트용으로 제일 많이 쓰입니다.(거의 CCTV 업계표준 수준)
그리고 VLC 플레이어 라이브러리가 ocx 컴포넌트 형태로 제공됩니다.

좋아요 4

영상 자체를 직접 핸들링하지는 않아서 영상 기술 자체에 대한 전문성은 없지만
영상을 받아서 뿌리는 작업을 많이 해봐서 약간의 조언을 드릴 수 있을 거 같아욜.ㅇㅅㅇ/

아마 2~3개만 올려도 버벅댄다는 건 스트리밍 영상의 크기가 커서 그럴 수 있고 보여지는데요

옛날 회사에서 CCTV 영상을 400~500 개 올려서 디스플레이하던 방식을 생각해보면

리사이징과 트랜스코딩은 필수로 가져가야할 거라고 생각이 들어요.

예를 들어
FHD 모니터에 프로그램을 놓고 돌렸을 때
4k 영상을 1개 온전히 띄우는 건 낭비이죠. 4k 영상 전체를 FHD 에 담을 수가 없으니까요.

혹은
FHD 영상 4개를 FHD 모니터에 표시한다고 하면
영상 하나당 실제로 화면에 표시되는 크기는 720p 수준이 될텐데, 굳이 4개의 영상 모두를 FHD 로 디코딩할 필요가 없는 거죠.
(여기서 낭비되는 리소스를 줄이는 게 관건입니닷 =ㅂ=/)

즉슨,
한 모니터에 많은 영상을 표현하고자 한다면 한 화면 수준의 영상으로 리사이징된, 다운 트렌스코딩된 영상들을 모아서 표시해야한다는 겁니다.

그래서 보통 영상 스트림을 직접 받아서 리사이징과 트렌스코딩 처리를 해주는 인코딩 서버를 하나 두고
클라이언트에서는 인코딩 서버에 딱 적정 크기로 요청한 영상만 받아서 디코딩 렌더링 해야합니다.

그렇게 하면 원본 크기가 4k 인 영상이 아무리 많이 들어와도
결국 클라이언트 입장에서는 모니터 하나 크기의 디코딩만 해서 렌더링하면 되는 거죠.
(대신 전체 부하는 인코딩 서버에서 감당하게 됩니다.)

좋아요 7

영상을 디코딩해서 렌더링하는 과정은 대략

클라이언트에서는 디코딩 모듈을 따로 준비해두고 인코딩 서버에서 패킷이 들어오면
DX 의 surface 에 디코딩된 메모리를 복사합니다.

그리고 WPF 의 VisualBrush 같은 걸로 대상 surface 의 영역 메모리 정보를 가져와 Rectangle 같은 컨트롤의 Fill 속성에 할당하는 거죠.
(그러면 DX 의 surface 에 올라간 디코딩된 영상이 VisualBrush에서 Render 됩니다. DX 에서 Render 호출 X)

그렇게 이미지를 가져온 이후 이미지의 업데이트는 WPF 의 CompositionTarget.Rendering 이벤트에 맞춰서 Backbuffer 를 업데이트 하는 방식으로 사용하면 됩니다.

근데 제가 얘기한 게 좀 오래된 방식이라… 요즘에는 어떻게 하는 지 모르겠군요.
저게 DX9 으로 작업하던 시절 얘기니까… 근데 뭐 그때에도 영상 FHD영상 400~500 정도는 문제 없이 렌더링했어요.

저는 영상 보다는 영상을 렌더링하는 WPF 쪽 작업 위주로 해서, 자세한 건 다른 분들이 알려주실 겁니닷ㅋㅅㅋ

화이팅!

좋아요 7

네 한번 테스트봐야겠습니다. 답변 감사드립니다. ocx도 한번 찾아봐야 겠네요~

좋아요 1

와… 정성스러운 답변 감사드립니다. 말씀해주신 방법으로 처리가 된다면 서버쪽 작업이 필수로 들어가야 겠네요. 좋은 관점감사드립니다.

좋아요 1