반응형


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/ 


반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

+ Recent posts