반응형

VLC 영상처리

베이비캠으로 사용하려고 wyze cam v3를 샀고, 그 영상을 저장하기 위한 삽질 기록. rtsp 스트림 송출 방법은 나중에...

1. rtsp 스트림 영상을 일정 간격으로 잘라서 저장하기

VLC 용법에 대한 긴 메뉴얼이 있지만 너무 길어서, GPT의 도움을 받아서 시도해봤다. 아래 명령줄은 vlc를 실행해서 5초간 영상을 저장하고 종료하는 것.

powershell 명령어를 받아서 테스트.
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$filename = "output-file-$timestamp.ts"
vlc rtsp://192.168.50.37:8554/baby-cam-a --run-time=5 --sout=file/ts:$filename --stop-time=5 vlc://quit

꽤 만족할만한 결과가 나왔는데, 아직 수정해야 할 것이 있다.

  1. 옵션에서 환경변수 $filename은 정상적으로 대응되지 않고, 파일이름이 $filename으로 저장된다.이건 파이썬이나 크론탭 적용하면 되는 간단한 문제.
  2. 파일 확장자가 ts라는 생소한 확장자다. 찾아보니 mpeg2 포맷인데, 편의를 위해 mp4나 avi로 변환해서 저장해야겠다.
  3. wyze bridge의 문제인데, docker 실행 시 바로 rtsp로 영상 스트림이 시작되는 것이 아니라, 요청이 있어야 스트리밍이 시작된다.

2. 영상 인코딩 + 포맷 변환해서 저장

영상 포맷 관련해서는 VLC 위키 페이지에 친절하게 정리되어 있다. (잘은 모르겠지만) MPEG2는 MPEG4(mp4)보다 원본에 더 가깝지만 당연히 용량이 더 크다는 문제가 있다.

muxer is one of the formats supported by VLC's stream output, i.e. :
ogg for OGG format,
ps MPEG2-PS format,
ts for MPEG2-TS format.

단순 용량 뿐 아니라, 나중에 다른 환경에서 재생할 경우의 편의성을 위해 mp4로 변환해서 저장하려고 한다. 이를 위해선, vlc cmdline에서 입력 한 변수중에 --sout을 수정하면 되는 듯 하다. 마찬가지로 VLC 위키에 transcoding에 대한 예시가 있기에 따라해보면 원활하게 h264 포맷의 mp4로 변환해서 저장하는 것이 가능하다.

--sout="#transcode{acodec=mpga, vcodec=h264}:std{access=file, mux=mp4, dst=sample_new.mp4}"

근데 막상 영상 재생을 하니 오디오 코덱이 없다고 소리가 안나온다.

 

이건 또 뭔 문제냐... 하면서 살펴보니, 오디오 코덱 (acodec={~~})이 mpga로 설정되어 있어서, AAC로 한번 바꾸면 해결된다.

최종 변환코드

--sout="#transcode{acodec=aac, vcodec=h264}:std{access=file, mux=mp4, dst=sample_new.mp4}"

파이썬으로 vlc 실행

내가 스트리밍 프로토콜에 대해 잘 안다면 파이썬으로 바로 rtsp 스트림을 받아서 처리하면 되겠지만 난 그런 능력자가 아니므로 vlc를 python으로 실행하는 방법을 택했다.

1. 파이썬으로 vlc 실행

이건 간단하게, bash와 동일하게 subprocess.run([vlc arguments])으로 실행하면 된다. 문제는 의도대로 실행되지 않는다는 것.

영상 저장 시 duplicate 하여 저장

영상 저장을 두가지 파일로 하려고 한다.

  • realtime.mp4: 다시한번 스트리밍 할 영상
  • {current_time}.mp4: 블랙박스마냥 모든 영상을 저장할 생각.

duplicate 저장을 위해서 #transcode를 아래 구문으로 수정하면 된다.

['vlc', '-I', 'dummy', '--stop-time', '5', 'rtsp://192.168.50.37:8554/baby-cam-a', '--sout', '#transcode{acodec=aac, vcodec=h264}:duplicate{dst=std{access=file, mux=mp4, dst=output.mp4},dst=std{access=file, mux=mp4, dst=output2.mp4}}', 'vlc://quit']

buffer deadlock 문제 발생

명령 실행 시 아래 프롬프트가 뜨는걸로 봐선 Xe graphics 가속이 병행되는거같은데 이 과정에서 뭔가 문제가 생기는 것 같다. 하드웨어 가속이 문제인 것 같다... 고 생각했는데, 우분투에서도 동일한 문제가 발생한다. 나중에 다시 봐야함.

avcodec generic: Using D3D11VA (Intel(R) Iris(R) Xe Graphics, vendor 8086(Intel), device 46a8, revision c) for hardware decoding

2. 우분투 22.04에서 vlc 사용

위키 페이지 대로 apt install vlc를 하면 3.0.16버전이 설치된다. (현재 최신 버전은 3.0.18) 예전버전이라 그런가는 확실하지 않지만, 초반에 rtsp 스트림 자체를 받지 못해서 한시간정도 삽질을 했다. 결론은 3.0.18을 사용해야 하고, 내 경우 (ubuntu 22.04 LTS)에서는 flatpak으로만 정상적으로 작동했다.

sudo apt-get install flatpak #flatpak을 먼저 설치하고
flatpak install flathub org.videolan.VLC #vlc 설치
flatpak run org.videolan.VLC #flatpak에 설치된 vlc 실행.

이후 실행 구문을 수정함. alias를 넣을까 했는데, 나중에 또 뭔 에러가 발생할지 걱정돼서 그렇게 하지 않았다.

['flatpak', 'run', 'org.videolan.VLC', '-I', 'dummy', '--stop-time', '5', 'rtsp://192.168.50.37:8554/baby-cam-a', '--sout', '#transcode{acodec=aac, vcodec=h264}:duplicate{dst=std{access=file, mux=mp4, dst=2023-06-16_13-09-46.mp4},dst=std{access=file, mux=mp4, dst=realtime.mp4}}', 'vlc://quit']
728x90
반응형

'서버만들기 > 베이비캠' 카테고리의 다른 글

Flask HLS streaming / HTML5 video 재생 (vue/nuxt)  (0) 2023.07.16
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기