mpv vs Media3 — 이 폰이 못 여는 파일이 재생되는 이유
게시일 2026년 8월 11일

맨 위 영상은 10비트 H.264 라는 형식입니다. 이 폰의 영상 전용 칩은 그 형식을 못 읽습니다. 실제로 재생을 시도한 첫 엔진은 실패했습니다. 그런데 화면에는 영상이 나옵니다.
플레이어 하나에 재생 엔진이 둘 들어 있습니다
CoPlayer 에는 재생 엔진이 두 개 실려 있습니다. 하나는 안드로이드 표준 재생 엔진인 Media3 이고, 다른 하나는 PC 에서 오래 쓰인 mpv 입니다. 둘 중 하나를 고르는 게 아니라, 둘 다 들고 다닙니다.
이유는 단순합니다. 두 엔진이 실패하는 자리가 서로 다르기 때문입니다. mpv 는 폰의 하드웨어 디코더가 거부하는 형식을 소프트웨어로 풀어냅니다. Media3 는 저작권 보호가 걸린 영상이나 인터넷 스트리밍, 기기별 하드웨어 경로에서 검증된 범위가 넓습니다. 어느 하나로 정하면 반대편의 실패를 그대로 떠안게 됩니다.
그래서 설정에서 고르는 것은 「어느 엔진을 쓸까」가 아니라 「어느 쪽을 먼저 시도할까」 입니다. 나머지는 앱이 알아서 합니다.
앱이 알아서 하는 일 네 가지
하나. 먼저 시도할 쪽을 정합니다
새로 설치하면 mpv 를 먼저 시도하도록 맞춰 둡니다. 다루는 형식의 폭이 넓어서입니다. 업데이트로 올라오신 분들은 쓰던 순서가 그대로 유지됩니다 — 어느 날 갑자기 재생 동작이 바뀌는 쪽이 더 나쁘기 때문입니다. 그리고 mpv 를 실을 수 없는 기기에서는 어느 쪽을 골라 두든 Media3 만 씁니다.
둘. 못 열면 넘깁니다
첫 엔진이 파일을 열지 못하면 두 번째 엔진이 이어받습니다. 맨 위 스크린샷이 그 장면입니다. 같은 순간 앱이 남긴 기록은 이렇습니다.
엔진 폴백: Media3 로 열지 못해 mpv 로 전환: ERROR_CODE_DECODING_FAILED
이 파일은 소프트웨어로 재생된다 (사유=HARDWARE_SKIPPED)
한 줄로 옮기면, 「전용 칩이 거부했으니 CPU 로 풀어서 보여준다」입니다. 사용자가 한 일은 파일을 연 것뿐입니다.
다만 아무 실패에나 넘기지는 않습니다. 넘겨서 결과가 달라질 만한 실패일 때만입니다 — 형식을 모르거나, 풀어낼 준비에 실패하거나, 그 엔진이 애초에 다룰 줄 모르는 종류의 파일일 때. 회선이 끊겼거나 공유 폴더 비밀번호가 틀린 경우에는 넘기지 않습니다. 엔진을 바꿔도 같은 자리에서 막히고, 헛된 접속만 한 번 더 하게 되니까요.
넘기는 것은 파일을 여는 순간의 일이고, 한 파일에 한 번뿐입니다. 재생이 시작된 다음에 엔진을 갈아 끼우지는 않습니다. 그리고 한 번 넘어간 파일은 기억해 둡니다 — 다음에 같은 파일을 열면 실패했던 쪽을 건너뛰고 바로 열립니다.
그리고 실패가 늘 오류로 나타나는 것은 아닙니다. MKV 파일 안에 애플 무손실(ALAC)로 담긴 소리가 그렇습니다. 표준 엔진은 그 소리를 다루지 못하는데, 오류를 내는 대신 소리 트랙이 처음부터 없었던 것처럼 재생해 버립니다. 화면은 멀쩡하고 오류도 없고 소리만 안 납니다. 사용자 입장에서는 고장 났다는 신호가 어디에도 없으니 파일을 의심하게 되는 자리입니다.
그래서 앱은 파일 안쪽을 직접 들여다보고 「담겨 있다고 적힌 소리」와 「실제로 준비된 소리」를 맞춰 봅니다. 적혀 있는데 없으면 그것도 실패로 치고 mpv 로 넘깁니다. 애초에 소리가 없는 무성 영상을 고장으로 오해하지 않도록, 확실할 때만 그렇게 합니다.
셋. 무거울 것 같으면 미리 돌립니다
넘기는 것은 실패한 다음의 일입니다. 그런데 실패하지 않더라도 재생이 괴로울 것이 뻔한 경우가 있습니다. 4K 10비트 영상이 그렇습니다. mpv 로 열면 열리기는 하지만 소프트웨어로만 돌아서 초당 몇 장 수준이 됩니다.
그래서 앱은 파일을 열기 전에 성질을 먼저 읽고, 이 경우에는 mpv 우선 설정을 일부러 뒤집어 Media3 로 보냅니다.
라우팅: mpv → Media3 (ROUTE) — 이 소재는 mpv 에서 소프트웨어로만 돈다
무엇을 보고 정하느냐면, 파일을 열기 전에 읽을 수 있는 것들입니다 — 색을 얼마나 촘촘히 담았는지(10비트인지, HDR인지), 그리고 화면 크기와 초당 장수를 곱한 값이 실측으로 확인해 둔 상한을 넘는지. 이 둘이 함께 성립할 때만 넘깁니다. 색 쪽이 확실하지 않으면 아무것도 하지 않습니다 — 평범한 영상을 괜히 넘겨서 화질 기능을 뺏는 것이 이 판단의 최악이기 때문입니다.
예외도 둘 있습니다. 돌비 비전 영상 가운데 일부는 크기와 상관없이 넘기지 않습니다. 표준 화면에서도 그대로 보이도록 만들어진 종류가 아니라면, 표준 엔진 쪽에는 그 색을 살릴 방법이 아예 없습니다 — 넘겨 봐야 헛걸음만 늘어납니다. 그리고 인터넷 너머의 영상은 대상이 아닙니다 — 열기도 전에 성질을 읽어 두려면 그만큼 기다려야 하니까요.
설정을 어기는 유일한 자리입니다. 설정을 지키는 것보다 재생을 살리는 쪽이 사용자가 원하는 것이라고 판단한 결과이고, 대신 그 때문에 무엇을 잃었는지는 화면이 말해 줍니다.
끊김 없이 재생하려고 이 영상은 다른 방식으로 재생합니다 · 화질 보정은 이번에 걸지 않습니다
이 안내는 상황이 달라진 순간에만 한 번 뜹니다. 같은 폴더의 무거운 영상을 연달아 열어도 매 편 같은 말을 반복하지는 않습니다 — 1편에서 이미 읽으셨을 테니까요.
넷. 지난번에 앱이 죽었으면 순서를 내립니다
mpv 는 폰 바닥에 가까운 곳에서 도는 코드라, 깨우는 데 실패하면 앱이 통째로 꺼집니다. 진짜 문제는 그다음입니다 — 설정에는 여전히 mpv 를 먼저 쓰라고 적혀 있으니, 다시 켜도 같은 자리에서 또 꺼집니다. 설정 화면까지 갈 수가 없으니 사용자 스스로 빠져나올 방법이 없어집니다.
그래서 앱은 mpv 를 깨우기 직전에 표시를 하나 남기고, 무사히 깨어나면 지웁니다. 다음에 켰을 때 그 표시가 남아 있으면 지난번에 거기서 죽었다는 뜻이므로, 그 실행에서는 mpv 를 1순위에서 내립니다. 설정을 고쳐 쓰는 것이 아니라 이번 실행의 순서만 바꾸는 것이고, mpv 는 2순위로 그대로 남습니다 — mpv 만 열 수 있는 파일은 여전히 재생됩니다.
조금 더 깊이 — 두 엔진은 잘하는 일이 다릅니다
화질을 다시 그리는 기능(셰이더 화질 향상·디밴딩·HDR 밝기·선명도·프레임 보간)과 대사 강조·공간 음향·음색 조절은 mpv 에만 있습니다. 반대로 조용한 구간 건너뛰기는 Media3 에만 있습니다. 야간 모드는 두 엔진 모두에 구현이 있습니다.
그래서 설정 화면은 지금 우선순위로는 걸리지 않는 효과가 있으면 그 이름을 하나씩 들어 알려 줍니다. 예전에는 「켜 둔 화질·음향 효과가 적용되지 않을 수 있습니다」라고만 적었는데, 그 문장은 방금 전부 껐다고 믿는 사용자에게 근거 없는 잔소리로 보였습니다. 무엇이 남았는지 말하지 않았기 때문입니다. 지금은 항목을 댑니다.
정직하게 말하면
- 어느 쪽을 골랐든, 실제로 무엇이 재생했는지는 파일마다 다릅니다. 위에 적은 네 가지가 다 그 때문입니다. 그래서 「이 설정이면 이 기능이 걸린다」고 단정할 수 없는 경우가 생깁니다. 지금 이 영상에서 무엇이 걸렸는지는 재생 화면에서 확인하는 편이 정확합니다.
- 엔진마다 없는 기능이 있다는 것은 불편한 사실입니다. 조용한 구간 건너뛰기를 쓰려고 먼저 시도할 엔진을 표준 쪽으로 바꾸면 화질 향상과 대사 강조를 잃습니다. 양쪽을 다 채우는 작업은 검토 중입니다.
- 넘긴다고 원래 속도가 되는 것은 아닙니다. 무거운 4K 영상을 표준 엔진으로 보내면 볼 만해지기는 하지만, 원래의 초당 장수를 그대로 채우지는 못합니다. 「살린다」이지 「고친다」가 아닙니다.
- 소프트웨어로 재생하면 전기를 더 씁니다. 하드웨어가 못 여는 파일을 살리는 대가입니다.
- 여기 이름을 댄 기능 대부분은 Pro Kit 기능입니다. 화질을 다시 그리는 다섯 가지와 공간 음향·음색 조절·조용한 구간 건너뛰기가 그렇습니다. 대사 강조와 야간 모드는 무료입니다. 설치하고 7일 동안은 구매 없이 전부 써 볼 수 있습니다.
그래서 뭘 고르면 되나요
대부분은 그대로 두면 됩니다. 처음 맞춰 둔 순서가 가장 넓은 범위를 커버하고, 나머지는 앱이 판단합니다. 설정을 만질 이유는 하나뿐입니다 — 조용한 구간 건너뛰기를 반드시 써야 하는데 그 영상이 mpv 로 열릴 때입니다. 그때는 설정 → 재생 효과 → 재생 엔진 우선순위에서 표준 쪽을 먼저 시도하게 바꾸고, 대신 화질·음향 기능 몇 가지를 잃는다는 것을 알아 두세요.
이 글의 확인 조건
- 실증은 갤럭시 S21(Android 14)에서 했습니다. 사용한 영상은 오픈 라이선스 애니메이션 「Morevna」 Episode 3(Morevna Project, CC-BY-SA 3.0)을 10비트 H.264 로 다시 인코딩한 30초 조각과, 4K 10비트로 만든 20초 조각입니다.
- 본문에 인용한 기록 세 줄은 그 재생 중에 앱이 남긴 것을 그대로 옮긴 것이고, 화면 안내 문구는 앱에 들어 있는 문장 그대로입니다.
- 나머지 동작 설명 — 소리만 없는 실패를 가려내는 것, 돌비 비전을 넘기지 않는 것, 시동에 실패한 다음 실행에서 순서를 내리는 것 — 은 앱 코드를 대조해 확인했습니다. 이 회차에 그 장면까지 촬영해 재현하지는 않았습니다.