FFmpeg를 사용하여 웹캠 영상과 동영상 파일을 RTSP 스트리밍하고 RTSP URL을 입력으로 vlc에서 영상을 재생시켜봅니다.
Ubuntu 20.04에서 테스트를 진행하였습니다.
2020. 7. 12 최초작성
웹캠 정보를 확인하기 위한 패키지를 설치합니다.
$ 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로 영상을 전송하기 위해 필요한 모듈입니다.
$ sudo apt-get install libmoose-perl liburi-perl libmoosex-getopt-perl libsocket6-perl libanyevent-perl $ sudo cpan AnyEvent::MPRPC::Client $ sudo apt install git $ git clone https://github.com/revmischa/rtsp-server $ cd rtsp-server $ perl Makefile.PL $ make $ make test $ sudo make install |
서버 프로그램 rtsp-server.pl의 위치를 찾아서 실행시킵니다.
포스트와 다른 위치에 서버 프로그램이 위치 할 수 있기때문에 위치를 확인하는게 좋을 듯합니다.
webnautes@webnautes-PC:~$ sudo find / | grep rtsp-server.pl
find: ‘/run/user/1000/doc’: 허가 거부
find: ‘/run/user/1000/gvfs’: 허가 거부
find: ‘/run/user/125/gvfs’: 허가 거부
/usr/local/share/perl/5.30.0/RTSP/rtsp-server.pl
$ webnautes@webnautes-PC:~$ sudo /usr/local/share/perl/5.30.0/RTSP/rtsp-server.pl
Starting RTSP server, log level = 2
웹캠에서 지원하는 영상 포맷을 다시 확인해봅니다.
현재 사용중인 웹캠에서는 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
웹캠에서 제공하는 Raw 포맷인 yuyv422 영상을 입력으로 하여 .264 코덱으로 인코딩하여 영상 스트리밍을 시작합니다.
사용하는 웹캠에 따라 포스트와 영상 포맷이 다를 수 있습니다. RTSP 주소에서 IP는 현재 사용중인 PC의 아이피로 변경하여 사용하세요.
$ ffmpeg -f v4l2 -input_format yuyv422 -i /dev/video0 -c:v libx264 -f rtsp rtsp://192.168.0.2:5545/cam |
이제 vlc를 사용하여 RTSP 스트리밍을 재생해봅니다.
vlc 패키지를 설치해야 합니다.
$ sudo apt install vlc |
ffmpeg에서 지정한 RTSP 주소를 입력으로 하여 RTSP 스트리밍을 재생해봅니다. 포트 번호는 적을 필요없습니다.
--network-caching 옵션의 값으로 3000을 사용했습니다. 이 값이 높을 수록 부드럽게 영상이 재생되지만 딜레이가 많아지며, 이 값을 낮추면 딜레이가 줄어드는 대신 영상이 끊길 수 있습니다.
디폴트 값은 1000입니다.
$ vlc -vvv --network-caching 3000 rtsp://192.168.0.2/cam |
다음과 같은 에러가 나면서 영상이 보이지 않는다면
[h264 @ 0x7faff4082600] hardware accelerator failed to decode picture
다음처럼 --avcodec-hw=none 옵션을 추가하여 하드웨어 가속을 끄고 다시 해보세요.
하드웨어 가속이 가능하도록 필요한 드라이버를 설치해도 될듯한데 아직 해보지 못했습니다.
$ vlc -vvv --network-caching 3000 rtsp://192.168.0.2/cam --avcodec-hw=none |
웹캠 영상이 vlc에 보여지는데 약간의 딜레이가 있습니다.
딜레이를 줄여 실시간으로 영상을 재생하는 방법은 아직 찾지 못했습니다.
이제 동영상 파일을 RTSP 스트리밍하여 vlc에서 재생 시켜봅니다.
앞에서 실행시켜 놓았던 RTSP Server가 실행 중인 상태인지 확인해보고 진행하세요.
다음 명령을 실행하면 동영상 파일 sample-mp4-file.mp4을 무한 반복하여 스트리밍하게 됩니다.
1번만 플레이하고 싶으면 -stream_loop -1 옵션을 제거하세요.
$ ffmpeg -re -stream_loop -1 -i sample-mp4-file.mp4 -c:v libx264 -f rtsp rtsp://192.168.0.2:5545/video |
이제 RTSP 스트리밍을 재생시켜봅니다.
하드웨어 가속에 문제가 있다면 앞에서 한것처럼 --avcodec-hw=none 옵션을 뒤에 추가하여 실행하면 됩니다.
$ vlc -vvv --network-caching 200 rtsp://192.168.0.2/video |
참고
https://theterminallife.com/turning-an-old-laptop-into-an-ip-camera/
'ffmpeg' 카테고리의 다른 글
FFmpeg를 사용하여 하나의 동영상 파일을 다중 RTSP 스트리밍하기 (0) | 2024.04.06 |
---|---|
FFmpeg를 사용하여 webcam을 RTSP 스트리밍 하여 OpenCV에서 확인하기 (0) | 2023.10.14 |
ffmpeg를 사용하여 동영상 파일을 jpg 이미지 파일로 변환하기 (0) | 2023.10.13 |