FFmpeg를 사용하여 웹캠 영상을 RTSP 스트리밍하기
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/