WebCodecs 디코더: 비동기 큐와 VideoFrame 자원 관리
WebCodecs는 코덱 객체에 압축된 오디오·비디오 데이터를 비동기로 전달하고 출력 프레임을 반환합니다. 설정 지원 확인, 디코더 큐의 backpressure, flush와 VideoFrame.close()의 역할을 설명합니다.
발행·오류 제보: infostoa · 편집 기준
이 글의 개별 작성자와 전문 검토자 정보는 제공되지 않습니다.
WebCodecs는 브라우저가 제공하는 저수준 인코더·디코더 객체로 압축된 오디오와 비디오를 처리합니다. VideoDecoder는 동기 함수처럼 즉시 프레임을 돌려주지 않고, 인코딩된 청크를 큐에 넣은 뒤 결과를 output callback으로 전달합니다. 따라서 호출 횟수만 늘리면 입력 큐와 출력 프레임이 쌓여 메모리나 지연 문제가 생길 수 있습니다. 지원 확인, 큐 관찰, 프레임 해제를 하나의 처리 흐름으로 설계해야 합니다.
1. 설정 전에 코덱 지원을 확인하기
애플리케이션은 디코더를 구성하기 전에 필요한 codec, profile, coded width·height 같은 구성을 준비합니다. VideoDecoder.isConfigSupported()는 브라우저가 해당 구성을 지원하는지 확인하는 수단이며, 성공해도 모든 입력 샘플이나 실행 조건에서 디코딩이 성공한다고 보장하지 않습니다. 미지원 결과에는 대체 codec이나 서버 변환 등 다른 경로를 마련할 수 있습니다.
지원 확인 뒤 decoder의 configure()로 설정을 적용하고 decode()에 EncodedVideoChunk를 전달합니다. 실제 출력은 비동기 callback으로 오며, 지원되는 구성은 브라우저와 장치에 따라 달라질 수 있습니다. 오류 callback과 decoder state를 관찰하고, 잘못된 입력이나 구성 오류를 정상적인 실패 경로로 처리해야 합니다.
2. 디코드 큐와 입력 속도 조절
디코더는 입력 청크를 내부 제어 큐에 넣습니다. 생산자가 디코더가 처리하는 속도보다 빠르게 데이터를 공급하면 대기 청크가 쌓이고 지연이 커질 수 있습니다. decodeQueueSize를 관찰해 처리 backlog를 추정하고, 입력이 큐에 더해지거나 줄어드는 이벤트를 활용해 생산 속도를 조절할 수 있습니다. 이 값은 즉시 출력될 프레임 수나 전체 시스템 메모리 사용량과 같지 않습니다.
실시간 스트림에서는 오래된 프레임을 계속 쌓아두면 현재 시점의 재생이 늦어질 수 있습니다. 입력을 잠시 늦추거나 애플리케이션 정책에 맞춰 프레임을 건너뛸지 결정합니다. 다만 임의로 압축 청크를 버리면 이후 프레임이 기준 프레임을 필요로 해 디코딩이 실패할 수 있으므로, 코덱의 의존 관계를 고려해야 합니다. 큐 길이와 출력 지연을 함께 측정해 제한을 설정하십시오.
3. flush와 VideoFrame의 명시적 해제
flush()는 앞서 큐에 들어간 작업 처리를 마칠 때까지 기다리는 Promise를 반환합니다. 종료·구성 변경이나 스트림 끝에서 사용할 수 있지만, 매 프레임마다 flush를 호출하면 파이프라인이 불필요하게 멈출 수 있습니다. flush는 입력을 계속 무제한으로 허용해도 된다는 신호가 아니며, 호출 후의 상태와 decoder의 수명주기를 함께 관리해야 합니다.
출력 callback으로 전달된 VideoFrame은 애플리케이션이 사용하는 리소스입니다. 프레임을 렌더링이나 후속 인코딩에 넘긴 뒤에는 더 이상 필요하지 않을 때 close()를 호출해 참조 자원을 해제합니다. 특히 높은 프레임률에서 프레임을 닫지 않으면 메모리 압박이 커질 수 있습니다. 에러나 취소, 렌더링 실패 경로에서도 소유권이 남아 있는 프레임을 정리하도록 해야 합니다.
4. 전문가 관점: 실시간 지연과 자원 경계
W3C 규격은 지원 구성 확인, decoder 상태, 입력 제어 큐, output callback과 VideoFrame 해제 동작을 정의합니다. MDN은 브라우저의 저수준 코덱 API와 보안·지원 조건을 개발자 관점에서 설명합니다. 이 API는 코덱 처리를 노출하지만, 특정 기기에서 하드웨어 가속이나 고정 지연 시간을 보장하는 추상화는 아닙니다. 실제 성능은 입력 형식, 브라우저, 장치에 따라 달라집니다.
테스트에서는 목표 codec 구성이 가능한지 확인한 다음 연속 입력 속도, decodeQueueSize, 출력 시각, 프레임 해제 여부를 기록합니다. 빠른 입력·느린 출력, 잘못된 청크, 구성 실패, flush 중 종료도 시험합니다. 디코더 수명주기와 프레임 소유권을 명확히 하면 큐가 쌓이거나 리소스가 오래 살아남는 문제를 찾기 쉽습니다. 지원과 성능은 기기별로 확인하고, 필요하면 낮은 품질이나 대체 디코딩 경로를 준비합니다.