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 기반 비교를 통해 최적화된 파이프라인을 구성할 수 있었습니다.
추가 질문이 있으면 댓글로 남겨주세요! 😊
댓글