임베디드 관련 카테고리/Streaming

GStreamer를 사용한 TX2 스트리밍 테스트 및 성능 최적화 가이드

CBJH 2024. 12. 9.
728x90
반응형

NVIDIA TX2를 사용하여 GStreamer로 영상 스트리밍을 송출하고, 내부 네트워크에서 영상을 수신 및 실행하는 방법을 테스트했습니다. 특히, CPU와 GPU 기반 스트리밍 비교, 지연 시간 확인 방법, SPS/PPS 문제 해결 등을 포함한 성능 최적화 방법을 단계별로 정리했습니다.

 

  • Gstreamer란, 멀티미디어 데이터를 처리하고 변환하는 데 사용되며, 동영상/오디오 추출, 화질 변경, 비트레이트 설정, 네트워크 전송 등을 모두 지원합니다. FFmpeg와 VLC와 비슷한 역할을 합니다.
  • TX2란 Nvidia회사에서 만든 Jetson 운영체제(Ubuntu 기반) 임베디드 시스템 개발에서 널리 사용되는 보드입니다. 라즈베리 파이와 비슷한 용도이지만 가격 차이가 많이 나며 고성능입니다.

1. TX2에서 스트림을 Push하고, 내부 네트워크의 PC에서 수신 및 실행 테스트

송출 명령어 (TX2)

TX2에서 카메라 데이터를 TCP로 스트리밍하는 간단한 테스트 명령어입니다.

gst-launch-1.0 -v v4l2src device=/dev/video0 ! videoconvert ! x264enc tune=zerolatency bitrate=1000 speed-preset=superfast ! mpegtsmux ! tcpserversink host=0.0.0.0 port=5000

수신 명령어 (PC)

PC에서 GStreamer를 실행하여 스트림을 수신하고 실행합니다.

gst-launch-1.0 -v tcpclientsrc host=192.168.0.32 port=5000 ! tsdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink

2. 명령어 해석

송출 명령어 해석

gst-launch-1.0 -v v4l2src device=/dev/video0 ! videoconvert ! x264enc tune=zerolatency bitrate=1000 speed-preset=superfast ! mpegtsmux ! tcpserversink host=0.0.0.0 port=5000
  • v4l2src device=/dev/video0: /dev/video0 장치에서 카메라 데이터를 가져옵니다.
  • videoconvert: 데이터 포맷 변환.
  • x264enc tune=zerolatency: H.264 인코더를 사용하여 낮은 지연 시간으로 압축.
  • mpegtsmux: MPEG-TS 포맷으로 패키징.
  • tcpserversink host=0.0.0.0 port=5000: TCP 서버로 데이터 송출. 모든 네트워크 인터페이스에서 수신 가능.

수신 명령어 해석

gst-launch-1.0 -v tcpclientsrc host=192.168.0.32 port=5000 ! tsdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
  • tcpclientsrc host=192.168.0.32 port=5000: TX2에서 송출된 TCP 스트림을 수신. host는 TX2 내부 IP 주소
  • tsdemux: MPEG-TS 스트림을 디멀티플렉싱.
  • h264parse: H.264 스트림을 파싱.
  • avdec_h264: H.264 데이터를 디코딩.
  • videoconvert: 데이터 포맷 변환.
  • autovideosink: 적절한 비디오 싱크를 자동 선택하여 출력.

3. 지연 시간 확인

지연 시간은 **프레임 처리 속도(FPS)**를 통해 간접적으로 확인할 수 있습니다.

지연 시간 확인 명령어

gst-launch-1.0 -v tcpclientsrc host=192.168.0.32 port=5000 ! tsdemux ! h264parse ! avdec_h264 ! videoconvert ! fpsdisplaysink text-overlay=false sync=false

출력 메시지 해석

/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 2311, dropped: 0, current: 28.26, average: 28.02
  • rendered: 처리된 총 프레임 수.
  • dropped: 누락된 프레임 수.
  • current: 최근 1초 동안의 FPS (현재 속도).
  • average: 스트리밍 평균 FPS.

FPS가 낮을수록 지연 시간이 길어집니다. 예를 들어, 카메라가 30 FPS로 출력되는데 current FPS가 28이라면 약 66ms의 지연이 발생한다고 볼 수 있습니다.


4. CPU 기반 명령어와 GPU 기반 명령어의 차이

CPU 기반 명령어

gst-launch-1.0 -v v4l2src device=/dev/video0 ! videoconvert ! x264enc tune=zerolatency bitrate=1000 speed-preset=superfast ! mpegtsmux ! tcpserversink host=0.0.0.0 port=5000
  • **x264enc**는 CPU를 사용하여 영상을 H.264로 인코딩합니다.
  • CPU 부하가 높아질 수 있으며, 프레임 처리 속도가 제한될 가능성이 있습니다.
  • CPU 기반 명령어가 잘 실행된다면 GPU 기반 명령어로 테스트해보세요.

GPU 기반 명령어

gst-launch-1.0 -v v4l2src device=/dev/video0 ! nvvidconv ! 'video/x-raw(memory:NVMM),width=640,height=480,framerate=30/1' ! nvv4l2h264enc bitrate=2000000 ! h264parse ! mpegtsmux ! tcpserversink host=0.0.0.0 port=5000
  • **nvvidconv**와 **nvv4l2h264enc**는 NVIDIA GPU를 활용합니다.
  • GPU의 병렬 처리로 CPU 부하를 줄이고 처리 속도를 크게 향상시킵니다.
  • 하지만 초기화 데이터(SPS/PPS)가 누락될 가능성이 있습니다.
  • 비트레이트 (bitrate=2000000):
    • 송출 영상의 최대 화질을 설정.
    • 640x480 해상도에서 2Mbps는 충분히 선명한 화질을 제공합니다.
    • 낮은 네트워크 대역폭 환경에서는 이 값을 줄여야 할 수 있습니다.
  • 프레임레이트 (framerate=30/1):
    • 카메라에서 초당 30프레임을 캡처하고 스트림에 포함.
    • 부드럽고 자연스러운 영상 재생을 위한 일반적인 설정.

5. SPS/PPS 부족 문제 해결 및 명령어 해석

GPU 기반 명령어를 실행할 때, SPS/PPS 데이터 부족으로 인해 스트림 수신에 실패할 수 있습니다. 이를 해결하려면 insert-sps-pps=true 옵션을 추가합니다.

수정된 GPU 기반 송출 명령어

gst-launch-1.0 -v v4l2src device=/dev/video0 ! nvvidconv ! 'video/x-raw(memory:NVMM),width=640,height=480,framerate=30/1' ! nvv4l2h264enc bitrate=2000000 insert-sps-pps=true ! h264parse ! mpegtsmux ! tcpserversink host=0.0.0.0 port=5000

명령어 해석

  • insert-sps-pps=true: 매 GOP(Group of Pictures)마다 SPS/PPS 데이터를 삽입하여 디코더가 스트림을 올바르게 해석할 수 있도록 합니다.

결론

위 단계를 통해 GStreamer를 사용하여 TX2에서 GPU 기반 스트리밍을 송출하고, 내부 네트워크에서 안정적으로 스트림을 수신 및 재생할 수 있었습니다.
특히 SPS/PPS 부족 문제 해결CPU 및 GPU 기반 비교를 통해 최적화된 파이프라인을 구성할 수 있었습니다.

추가 질문이 있으면 댓글로 남겨주세요! 😊

댓글