GStreamer의 Udpsink와 Udpsrc를 이용한 카메라 영상 파이프라인에 대해 알아보겠습니다.
gst-launch-1.0 nvarguscamerasrc sensor-id=0
! 'video/x-raw(memory:NVMM), widht=1920, height=1080, format=(string)NV12, framerate=30/1'
! nvvidconv
! omxh264enc
! 'video/x-h264, stream-format=byte-stream'
! h264parse
! rtph264pay
! udpsink port=3000
위의 코드는 GStreamer를 이용하여 udp로 송출하는 코드이다. 위의 코드를 통해 GStreamer의 각 파이프 라인을 구간별로 알아보자
gst-launch-1.0 nvarguscamerasrc sensor-id=0
! 'video/x-raw(memory:NVMM), widht=1920, height=1080, format=(string)NV12, framerate=30/1'
! nvvidconv
0번 센서에 연결된 카메라를 인식하여 raw video 데이터를 sink 한다. nvarguscamerasrc는 nvidia에서 제공하는 카메라 플러그인이다. 영상의 포맷은 NV12만 지원한다.
카메라를 통해 받은 raw video 데이터를 이전 위의 파이프라인에서 명시한대로 변환 한다. NV12는 nvidia의 YUV영상 포맷중 하나이다. YUV영상 포맷은 빛의 광도와 휘도를 사용하여 사람 눈으로 인식하기 어려운 빛의 영역을 제거하여 데이터의 양을 줄인 포맷이다.
memory:NVMM는 영상 데이터를 DMA buffer 사용하여, 영상 데이터를 GPU 메모리등 다른곳에 할당할때 DMA buffer를 사용한다는 것을 의미한다.
! omxh264enc
omxh264enc는 OpenMAX IL H.264 Video encoder이다. Raw video 데이터를 OpenMAX Api를 이용하여 h264 포맷으로 인코딩 한다.
! 'video/x-h264, stream-format=byte-stream'
! h264parse
h264 영상을 다음과 같이 parse하는 파이프 라인이다. 파싱하는 데이터의 정보는 아래와 같으며, Stream-format과 Default 파싱 데이터도 같이 포함되어 있다.
! rtph264pay
위 파이프 라인에서는 파싱한 h264의 payload를 rtp 패킷으로 인코딩한다. 별도의 옵션을 지정하지 않으면 Default 옵션은 아래와 같다.
! udpsink port=3000
Udp를 이용하여 3000번 포트로 sink(송신)한다. host 옵션 생략시 default는 localhost 이다.
gst-launch-1.0 udpsrc port=3000
! 'application/x-rtp, encoding-name=H264, payload=96'
! rtph264depay
! avdec_h264
! nvvidconv
! nvegltransform
! nveglglessink
아래 코드는 위에서 송출한 udpsink의 데이터를 받아 화면에 표시하는 파이프 라인이다.
gst-launch-1.0 udpsrc port=3000
! 'application/x-rtp, encoding-name=H264, payload=96'
! rtph264depay
3000번 포트로 udp 데이터를 수신한다. 그 후 Rtp 패킷을 위 파이프 라인에 명시된 형식에 맞게 decoding한다.
payload=96은 데이터 payload의 타입을 96은 dynamic type을 의미한다.
! avdec_h264
Rtp 패킷에서 디코딩 된 h264의 데이터를 디코딩 하여 video/x-raw데이터로 변환한다.
! nvvidconv
Decoding 된 raw video데이터를 컨버팅한다.
! nvegltransform
nveglglessink를 사용하기 위해 메모리 타입을 memory:NVMM → memory:EGLImage로 변경한다. 메모리 타입을 변경하는 이유는 CPU에서 EGLImage 렌더링시 GPU에서 바로 렌더링 데이터를 사용할 수 있어 연산 횟수를 줄일수 있기 때문이다.
! nveglglessink
영상 데이터를 화면에 창 형태로 표시한다. EGLImage 메모리 타입만 지원한다.
EGLImage 메모리 타입은 openGL client API들 간에 이미지를 공유하기위해 만들어진 타입이다.
여기까지 GStreamer를 이용한 UDP sink, src에 대해 알아보았습니다. 정확하지 않거나 틀린 내용은 지적해 주시면 감사하겠습니다!