ffmpeg

FFmpeg를 사용하여 웹캠 영상을 RTSP 스트리밍하기

webnautes 2024. 8. 15. 17:12
반응형

FFmpeg를 사용하여 웹캠 영상을  RTSP 스트리밍하고 RTSP URL을 입력으로 영상을 재생시켜봅니다.

Ubuntu 22.04에서 테스트를 진행하였습니다. 



2020. 7. 12  최초작성, Ubuntu 20.04

2024. 8. 15  Ubuntu 22.04, rtsp 서버 프로그램 변경




웹캠 정보를 확인하기 위한 패키지를 설치합니다. 

 

$ sudo apt install  v4l-utils




현재 PC에 연결된 웹캠의 디바이스 파일을 확인합니다.

 

$ v4l2-ctl --list-devices



확인해보면 /dev/video0와 /dev/video1 두개의 디바이스 파일이 찾아지지만

 

webnautes@webnautes-PC:~$ v4l2-ctl --list-devices

Integrated Camera: Integrated C (usb-0000:00:14.0-6):

/dev/video0

/dev/video1



각 디바이스 파일에 연결된 웹캠의 영상 포맷을 확인해보면 /dev/video1은 실제 웹캠이 아닙니다.

왜 생성되었는지는 알 수 없군요. 

 

$ v4l2-ctl -d /dev/video0 --list-formats



webnautes@webnautes-PC:~$ v4l2-ctl -d /dev/video0 --list-formats

ioctl: VIDIOC_ENUM_FMT

Type: Video Capture

 

[0]: 'MJPG' (Motion-JPEG, compressed)

[1]: 'YUYV' (YUYV 4:2:2)

 

 

webnautes@webnautes-PC:~$ v4l2-ctl -d /dev/video1 --list-formats

ioctl: VIDIOC_ENUM_FMT

Type: Video Capture

 

  

 

FFmpeg를 설치합니다. 

 

$ sudo apt install ffmpeg 



RTST Server 모듈을 설치합니다. FFmpeg에서 rtsp로 영상을 전송하기 위해 필요한 모듈입니다. 

 

아래 링크에서 mediamtx_v1.8.5_linux_amd64.tar.gz을 다운로드합니다. 글 작성 시점에 최신 버전은 1.8.5입니다.

https://github.com/bluenviron/mediamtx/releases



다운로드 후, 압축풀어 실행까지 시킵니다. 편의상 다운로드까지 터미널에서 진행했습니다.

 

$ wget https://github.com/bluenviron/mediamtx/releases/download/v1.8.5/mediamtx_v1.8.5_linux_amd64.tar.gz

$ tar -zxvf mediamtx_v1.8.5_linux_amd64.tar.gz 



현재 폴더에 생성된  mediamtx 를 실행합니다.

 

webnautes@webnautes-laptop:~$ ./mediamtx 

2024/08/15 16:49:31 INF MediaMTX v1.8.5

2024/08/15 16:49:31 INF configuration loaded from /home/webnautes/mediamtx.yml

2024/08/15 16:49:31 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)

2024/08/15 16:49:31 INF [RTMP] listener opened on :1935

2024/08/15 16:49:31 INF [HLS] listener opened on :8888

2024/08/15 16:49:31 INF [WebRTC] listener opened on :8889 (HTTP), :8189 (ICE/UDP)

2024/08/15 16:49:31 INF [SRT] listener opened on :8890 (UDP)




웹캠에서 지원하는 영상 포맷을 다시 확인해봅니다.

현재 사용중인 웹캠에서는 mjpeg와 yuyv422를 지원합니다.

 

$ ffmpeg -f v4l2 -list_formats all -i /dev/video0

 

webnautes@webnautes-PC:~$ ffmpeg -f v4l2 -list_formats all -i /dev/video0

ffmpeg version 4.2.2-1ubuntu1 Copyright (c) 2000-2019 the FFmpeg developers

  built with gcc 9 (Ubuntu 9.3.0-3ubuntu1)

  configuration: --prefix=/usr --extra-version=1ubuntu1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared

  libavutil      56. 31.100 / 56. 31.100

  libavcodec     58. 54.100 / 58. 54.100

  libavformat    58. 29.100 / 58. 29.100

  libavdevice    58.  8.100 / 58.  8.100

  libavfilter     7. 57.100 /  7. 57.100

  libavresample   4.  0.  0 /  4.  0.  0

  libswscale      5.  5.100 /  5.  5.100

  libswresample   3.  5.100 /  3.  5.100

  libpostproc    55.  5.100 / 55.  5.100

[video4linux2,v4l2 @ 0x5575401496c0] Compressed:       mjpeg :          Motion-JPEG : 1280x720 320x180 320x240 352x288 424x240 640x360 640x480 848x480 960x540

[video4linux2,v4l2 @ 0x5575401496c0] Raw       :     yuyv422 :           YUYV 4:2:2 : 1280x720 320x180 320x240 352x288 424x240 640x360 640x480 848x480 960x540




ifconfig 명령으로 현재 사용중인 IP 주소를 확인해야 합니다.  inet 항목에 127.0.0.1 외에 보이는 것이 현재 PC가 사용중인 IP입니다.  

 

$ ifconfig

enp7s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500

 

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 0  bytes 0 (0.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

        inet 127.0.0.1  netmask 255.0.0.0

        loop  txqueuelen 1000  (Local Loopback)

        RX packets 1742  bytes 168271 (168.2 KB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 1742  bytes 168271 (168.2 KB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

wlp0s20f3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.45.230  netmask 255.255.255.0  broadcast 192.168.45.255

 

        RX packets 91869  bytes 107744725 (107.7 MB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 30770  bytes 8793090 (8.7 MB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0





웹캠에서 제공하는 Raw 포맷인 yuyv422 영상을 입력으로 하여 .264 코덱으로 인코딩하여 영상 스트리밍을 시작합니다. 

사용하는 웹캠에 따라 포스트와 영상 포맷이 다를 수 있습니다. RTSP 주소에서 IP는 현재 사용중인 PC의 아이피로 변경하여 사용하세요.  



ffmpeg -f v4l2 -video_size 640*480 -i /dev/video0 -r 30  -c:v libx264 -preset fast -tune zerolatency  -f rtsp -rtsp_transport tcp rtsp://192.168.45.230:8554/visual

 

$ ffmpeg -f v4l2 -input_format yuyv422 -i /dev/video0  -c:v libx264 -f rtsp rtsp://192.168.45.230:8554/visual



문제 없다면 파란색 부분에 보이는 frame=의 숫자가 계속 증가하며 출력됩니다.

 

Output #0, rtsp, to 'rtsp://192.168.45.230:8554/visual':

  Metadata:

    encoder         : Lavf58.76.100

  Stream #0:0: Video: h264, yuv422p(tv, progressive), 640x480, q=2-31, 30 fps, 90k tbn

    Metadata:

      encoder         : Lavc58.134.100 libx264

    Side data:

      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A

frame=   17 fps=0.0 q=27.0 size=N/A time=00:00:00.53 bitrate=N/A dup=1 drop=0 speed=1frame=   32 fps= 31 q=27.0 size=N/A time=00:00:01.03 bitrate=N/A dup=1 drop=0 speed=1frame=   47 fps= 31 q=27.0 size=N/A time=00:00:01.53 bitrate=N/A dup=1 drop=0 speed=1frame=   63 fps= 31 q=27.0 size=N/A time=00:00:02.06 bitrate=N/A dup=1 drop=0 speed=1frame=   78 fps= 31 q=27.0 size=N/A time=00:00:02.56 bitrate=N/A dup=1 drop=0 speed=1frame=   93 fps= 31 q=27.0 size=N/A time=00:00:03.06 bitrate=N/A dup=1 drop=0 speed=1frame=  108 fps= 30 q=27.0 size=N/A time=00:00:03.56 bitrate=N/A dup=1 drop=0 speed= frame=  124 fps= 31 q=26.0 size=N/A time=00:00:04.10 bitrate=N/A dup=





이제 RTSP 스트리밍을 재생해봅니다.  

ffmpeg에서 지정한 RTSP 주소를 입력으로 하여 RTSP 스트리밍을 재생해봅니다. 

 

ffplay -fflags nobuffer -flags low_delay rtsp://192.168.45.230:8554/visual




잠시후 웹캠 영상이 보여집니다. 딜레이는 적은 편입니다.




참고

 

https://theterminallife.com/turning-an-old-laptop-into-an-ip-camera/ 

 

반응형