ffmpeg 또는 libav로 받은 동영상을 WinUI3나 UnoPlatform을 활용하여 플레이하는 기능 개발문의

안녕하세요. (주) 조이풀터틀즈의 최지수 입니다.

저희 회사는 광교 GBSA에 위치한 작은 스타트업입니다. 저희는 컴퓨터 비전과 AI 기술을 활용하여 이미지/동영상 처리하는 윈도우 데스크탑 어플리케이션을 개발하려고 있습니다.

어플리케이션은 현재 Unoplatform이라는 프레임워크를 사용하고 있습니다.
어플리케이션에서 구현하고자 하는 것은, 동영상 파일을 읽어와서 프레임 바이 프레임으로 재생/편집을 수행하고 편집된 영상을 다시 동영상으로 저장하는 기능 입니다.

동영상 버전 그림판 어플리케이션이라고 하면 적절한 비유가 될 것 같습니다.
OpenCV를 이용한다면 아래와 같은 의사코드 구조가 나올 것 같습니다.

// 비디오 재생을 하면서
While !EOF:
// 프레임을 얻어오기
EOF, frame = cam.read()
// 사용자가 만일 재생중에 비디오 재생영역을 클릭한다면 해당 포인트를 가져옴
x, y = getUserMouseLeftCilckPosition()
// 마우스 클릭한 지점에 rect나 ellipse 같은 도형, 이미지 등을 그림
editedFrame = drawRectangle(x, y, rect, frame)
// 비디오 인코더에 편집된 프레임을 추가
VideoWriter.Add(editedFrame)
// UI컨트롤에 편집된 프레임을 보여줌
CanvasControl.Background = editedFrame

// 인코딩하여 편집된 프레임을 가진 영상을 저장
VideoWriter.Save(editedFrame)

저희가 겪고 있는 애로 사항은 아래와 같이 두 가지 입니다.

  1. OpenCV나 기타 비전 라이브러리들이 제공하는 비디오 인/디코더는 오디오 재생과 비디오 저장 시 오디오를 포함하여 제공하는 것이 어려운 점
  2. ffmpeg으로 얻어온 영상과 오디오 프레임을 재생하여 기본 UI컨트롤에 Background 속성에 표현할 경우 기본 제공되는 MediaPlayerElement와 달리 재생이 끊키고 프레임간 이동이 매우 느림.
    (아무래도 영상 주사와 buffer 고려하지 않고 일반적인 UI 컨트롤 백그라운드에 단일 이미지 백그라운드 입히듯이 하여 문제가 되는게 아닌가 싶습니다.)

비디오 인디코딩과 Unoplatform/WinUI 프레임워크에 대한 지식을 가지신 분이 계시다면 도와주시면 좋겠습니다.

jisu.choi@joyfulturtles.com 으로 연락주시면 감사하겠습니다. :slight_smile:

1개의 좋아요

저는 일단 시간도 없고 우노 개발을 해 본적도 없어서 참고할만한 내용만 말쓴 드리겠습니다.
ffmpeg이 프레임 이동이 늦은건 생각하신 문제가 아니고 GOP 때문입니다.
다음 프레임을 제외한 프레임을 가져올 시 별도의 버퍼링이 들어가기 때문에 느릴 수 밖에 없습니다.
OpenCV가 비교적 빠른 건 관련 처리를 내부적으로 하고 있기 때문이고요.

그럼 어떤 식으로 처리하면 되느냐? 비디오 읽기는 OpenCV를 통해서 하고 저장만 ffmpeg으로 하면 됩니다. OpenCV에서 프레임 가져올 때 PTS값도 같이 가져와서 ffmpeg에 넘기면 됩니다.
OpenCV에 보면 PTS값을 가져오든가? 프레임 넘버에서 변환을 하든가? 하는 API가 있습니다.

3개의 좋아요

답변 너무 감사합니다.
제가 FFMPEG과 닷넷 개발 두 영역 모두 많이 무지한 편인데,
혹시 외주 개발이 어려우시다면, 과외라도 해주실 수 있을까요?
이쪽 지식을 제가 빨리 습득해야 하는 상황인데, 개발하면서 생기는 이슈나 잘 모르는 점들이 너무 많아서 그때 그때 기술적으로 자문을 구해야 하는 상황이 많습니다.

윈도우 어플리케이션을 유닛테스트, 배포
어플리케이션 사이즈 줄이는 법
CI/CD에 연결하는 방법
커스텀으로 UI 컨트롤 만드는 방법
성능 프로파일 하는 법
어플리케이션 아키텍처나 디자인 패턴을 잘 적용하는 방법 등등

오랜 노하우를 가지신 분이, 피드백을 해주셨으면 좋겠다는 생각을 많이 하고 있습니다. 제가 선택한 앱에 맞는 프레임워크나, 구조나, 패턴이 정말 맞게 선택한 것인지도 의심스럽고 설령 진짜 맞다고 해도 정말 제가 이해한 바가 해당 프레임워크나 구조나 패턴의 철학에 맞게 한게 맞는지도 의심스러운 상황입니다.

관련 스터디라도 참여해서 경력자 분들께 얼굴도 비치고 조언도 구하고 피드백도 받고 그러고 싶은데 당장 신청할 수 있는 관련 스터디를 못 찾고 있네요… ㅎㅎ

저 같이 독학으로 엉뚱하게 개발 진행하는 사람이 도움 받을 수 있는 방법이 없을까요?
제가 모르는 닷넷 데브외에 커뮤니티나, 스터디 모임 같은 것 알고 계시면 추천을 부탁드립니다 ㅠㅠ

1개의 좋아요

닷넷 관련은 여기밖에 없다 봅니다.
ffmpeg은 아예 없다고 봐도 무방하고요.
네이버에 opencv 커뮤니티 하나 있습니다.
관리는 거의 안되긴 한데. 질문에 답변은 달립니다.

마지막으로 과외는 당연히 시간도 안되고 누군가를 가르칠만한 실력이 못됩니다.
교육이 외주보다 시간 소모가 훨씬 큽니다.
조언을 드리자면 회사에 상황 설명 하시고 일정을 대폭 늘리고 공부 하시는 것이 바른 방향이라고 생각 되네요.
영상은 코어 기술에 가깝기 때문에 질문자가 기본적인 지식이 없을 경우 질문 자체가 산으로
가기 쉽습니다.

3개의 좋아요

ICODEBROKER님이 올리신 다음의 자료부터 시작해보시는 것은 어떨까요? .NET Framework에 WPF 환경이긴 하지만 분명히 참고가 되시리라 생각됩니다.

https://unosquare.github.io/ffmediaelement/

WinUI 3의 경우 Win2D를 통해 고속의 그리기가 가능하니 다음의 문서를 참고 바랍니다.

FFmpeg 관련해서는 FFmpeg.Autogen README.md에서도 공유된 정성태님이 준비하신 샘플도 참고하실 수 있습니다.

https://www.sysnet.pe.kr/2/0/13026

4개의 좋아요