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개의 좋아요