MP4가 재생되지 않는 이유와 컨테이너의 정체
재생되지 않는 MP4가 손상된 파일인 경우는 드뭅니다. 확장자는 컨테이너, 즉 스트림과 타임스탬프를 담은 포장지의 이름일 뿐입니다. 실제로 디코딩해야 하는 것은 그 안의 코덱이며, 똑같은 .mp4가 10년 된 휴대폰에서도 재생되는 H.264를 담을 수도 있고 2년 된 텔레비전이 손도 못 대는 AV1을 담을 수도 있습니다. 어떤 MP4는 재생되고 어떤 MP4는 재생되지 않는 이유가 이것입니다.
모든 동영상 파일에는 두 가지 질문이 적용됩니다. 어떤 상자에 들어 있는가, 그리고 그림이 어떻게 압축되어 있는가입니다. 상자를 바꾸는 일은 대개 공짜이고, 압축을 바꾸는 일은 결코 공짜가 아닙니다.
컨테이너는 상자이고 코덱은 그림입니다
| 컨테이너 | 비디오 코덱 | 오디오 | 지원 범위 |
|---|---|---|---|
| MP4 | H.264, H.265, 일부 AV1 | AAC, MP3 | 어디서나 |
| WebM | VP8, VP9, AV1 | Opus, Vorbis | 브라우저에서만 |
| MKV | 거의 모든 것 | AC-3, DTS, 무엇이든 | 데스크톱 플레이어, 브라우저는 아님 |
| MOV | H.264, H.265, ProRes | AAC, PCM | Apple 환경, 편집 |
| AVI | DivX, Xvid, MJPEG | MP3, PCM | 구형 Windows |
MKV는 관대한 쪽이라 보관에는 좋고 배포에는 나쁩니다. 규격상 유효한 MKV가 어떤 브라우저도 열지 못하는 조합을 담고 있을 수 있기 때문입니다. MOV와 MP4는 구조 대부분을 공유하므로 둘 사이를 오가는 일은 인덱스만 다시 쓰는 작업으로 끝나는 경우가 많습니다. 파일을 들여다보십시오.
input.mp4
Stream #0:0 Video h264 (High) 1920x1080 30 fps 4200 kb/s
Stream #0:1 Audio aac (LC) 48000 Hz stereo 128 kb/s
중요한 것은 "Video" 뒤에 오는 단어입니다. "mp4"라는 단어는 거의 아무것도 알려주지 않습니다.
어떤 코덱이 어디에서 재생되는가
| 코덱 | 동일 품질에 필요한 비트 | 라이선스 | 지원 범위 |
|---|---|---|---|
| H.264 (AVC) | 기준선, 100%로 봅니다 | 특허 풀, 거의 모든 곳에 라이선스됨 | 범용 |
| H.265 (HEVC) | 50~65% | 경쟁하는 여러 풀, 비용이 크고 정리되지 않음 | Apple은 지원, 브라우저는 제각각 |
| VP9 | H.265와 비슷 | 로열티 없음 | Chrome, Firefox, Edge, Android |
| AV1 | 30~50% | 로열티 없음 | 최신 브라우저, 최근 하드웨어 |
H.265는 기술적으로 뛰어나지만 상업적으로 껄끄러워서, 지원 여부가 기술이 아니라 벤더 진영에 따라 갈립니다. AV1은 압축률이 가장 좋은 대신 인코딩이 훨씬 느리며 때로는 자릿수가 달라질 정도입니다. 그래서 한 번 인코딩해 여러 번 보는 영상에 어울립니다. 시청자가 누구인지 알 수 없다면 여전히 MP4에 담은 H.264가 답이며, 동영상 압축 도구가 이를 목표로 삼습니다.
비트레이트, 해상도, 프레임 레이트
비트레이트는 출력 1초당 비트 수이며, 파일 크기는 오직 여기에서 결정됩니다. 재생 시간을 곱하면 그것이 파일 크기입니다.
1920 x 1080 x 30 fps x 3 bytes = about 186 MB per second raw
delivered at 4 Mb/s = about 0.5 MB per second
해상도를 두 배로 올리면 픽셀 수는 네 배가 되지만 필요한 비트는 네 배가 되지 않습니다. 더 큰 프레임에서는 이웃한 픽셀끼리 더 비슷해서 압축이 잘 되기 때문입니다. 대략 두세 배 정도를 예상하십시오. 그래서 가로와 세로를 절반으로 줄이는 것이 파일을 줄이는 가장 저렴한 방법 중 하나입니다. 이것이 동영상 크기 조정이고, 동영상 크롭은 픽셀을 아예 버립니다. 프레임 레이트는 좀 더 온건해서 30에서 60으로 올려도 100%가 아니라 20~40%만 늘어나며, 동영상 속도 변경은 대신 타임라인 자체를 줄입니다.
레이트를 제어하는 방식은 세 가지입니다.
- 고정 비트레이트는 처음부터 끝까지 한 가지 레이트를 유지합니다. 정지된 장면에서는 비트를 낭비하고 빠른 움직임에서는 화면이 무너집니다. 상한이 확실한 회선에 적합합니다.
- 목표치를 둔 가변 비트레이트는 전체적으로 평균을 맞추면서 장면들이 서로 비트를 빌려 쓰게 합니다. 크기를 예측할 수 있으므로 결과물이 특정 한도에 맞아야 할 때 사용합니다.
- 고정 품질은 보통 CRF 값으로 지정하며, 품질을 고정하고 비트레이트는 필요한 만큼 흘러가게 둡니다. 크기는 예측할 수 없고 품질은 고르며, 스트리밍이 아니라 시청용 영상의 기본 선택입니다.
H.264의 CRF 척도는 0부터 51까지이고 낮을수록 좋습니다. 18은 원본과 거의 구별할 수 없고, 23은 무난한 기본값이며, 28을 넘어가면 움직임이 무너집니다. 이 척도는 코덱 사이에 공유되지 않습니다.
키프레임, 그리고 자르기가 때때로 공짜인 이유
I 프레임, 즉 키프레임은 그 자체로 디코딩되는 완전한 그림입니다. P 프레임은 앞선 프레임에서 바뀐 부분만 저장합니다. B 프레임은 앞뒤 프레임 모두로부터 예측하며 압축률이 가장 좋습니다. 디코더가 표시 전에 프레임을 잠시 붙들고 있는 이유도 이것입니다.
키프레임과 거기에 의존하는 프레임들을 묶어 픽처 그룹이라고 하며, 웹용 인코더는 대략 2초마다 하나씩 배치합니다. 그룹 중간에서 자르면 남은 프레임들이 파일에 더 이상 없는 그림을 참조하게 되는데, 트리밍에 두 가지 모드가 있는 이유가 이것입니다. 스트림 복사는 즉시 끝나고 무손실이지만 키프레임 위에만 놓일 수 있어서 시작점이 그룹 길이만큼 밀릴 수 있습니다. 재인코딩은 원하는 지점에 키프레임을 만들어 주지만 시간과 품질을 대가로 치릅니다. 동영상 트리밍 도구는 둘 다 제공하며, 정확한 프레임이 중요한 경우가 아니라면 복사를 쓰십시오.
재인코딩이 품질을 깎는 이유는 손실 인코딩을 한 번 거칠 때마다 모델이 가장 덜 보인다고 판단한 부분을 버리기 때문입니다. 다시 인코딩하면 두 번째 처리는 첫 번째 처리가 남긴 아티팩트를 진짜 디테일로 취급해 그대로 보존하면서 자기 몫의 아티팩트까지 더하므로, 세대를 거칠수록 오차가 누적됩니다. 컨테이너만 바뀐다면 스트림을 복사하고, 오디오만 바뀐다면 그림은 복사하십시오. 동영상 음소거 도구가 하는 일이 그것입니다. 동영상 회전은 픽셀을 돌리는 대신 회전 플래그를 설정할 수 있지만, 그 플래그를 무시하는 플레이어에서는 원래 방향으로 보입니다. 픽셀을 반드시 바꿔야 한다면 모든 변경을 한 번에 처리하십시오.
오디오 트랙이 나머지 절반입니다
오디오는 자체 코덱, 샘플레이트, 채널 구성을 가진 별도의 스트림이며, 파일이 재생되지 않는 흔한 원인이기도 합니다. H.264 영상은 문제없이 디코딩하는 브라우저가 AC-3나 DTS 서라운드는 디코딩하지 못해 소리가 나지 않거나 파일 전체가 아예 실패할 수 있습니다. MKV로 된 디스크 립 파일이 늘 이런 식으로 실패합니다.
샘플레이트는 파형을 얼마나 자주 측정했는지를 나타내며, CD는 44100 Hz, 영상 표준은 48000 Hz입니다. 배포용으로 안전한 선택은 48000 Hz 스테레오 AAC이며, 음성은 128 kb/s 안팎, 음악은 192 kb/s 안팎이면 됩니다. 오디오 추출 도구는 트랙을 MP3, WAV, AAC, Opus로 뽑아냅니다.
동영상을 GIF로 만들기
GIF는 1987년에 나온 정지 이미지 형식에 애니메이션을 덧붙인 것이며, 제대로 된 움직임 보상이 없습니다. 각 프레임이 대체로 독립적으로 압축되므로, 같은 클립이 소리 없는 MP4로는 수백 킬로바이트인 데 비해 GIF로는 5초에 수 메가바이트에 이를 수 있습니다. 프레임당 색은 256개로 제한되고, 투명도는 1비트뿐이며, 오디오는 없습니다.
품질이 갈리는 지점은 색 제한입니다. 범용 고정 팔레트는 그라데이션에 띠를 만들고 강한 디더링을 부르는데, 그 잡음은 거의 무작위에 가까워 압축이 잘 되지 않고 파일을 부풀립니다. 클립 자체에서 팔레트를 뽑아낸 다음 프레임을 거기에 대응시키면 화질이 더 좋아지고 파일도 대개 더 작아집니다. 동영상 GIF 변환 도구가 그 과정을 수행합니다. GIF는 짧고 좁게 유지하십시오. 23초, 가로 480640픽셀, 초당 10~15프레임이 적당합니다. 목적지가 동영상을 받아준다면 음소거한 MP4를 보내십시오.
웹에서 통하는 설정
- 그냥 재생되기만 하면 되는 영상은 MP4에 담은 H.264와 AAC 오디오입니다.
- CRF는 23 근처로, 작은 글자가 있는 화면 녹화는 20까지 낮추고, 배경으로 흐르는 영상은 26까지 올립니다.
- 압축한 뒤가 아니라 압축하기 전에, 실제로 표시될 가로 폭으로 크기를 조정하십시오.
- faststart를 켜서 인덱스가 파일 앞쪽에 오게 하십시오. 그러면 다운로드가 끝나기 전에 재생이 시작됩니다.
여기 나온 모든 작업은 사용자 기기의 브라우저에서 실행되므로 업로드되는 것이 없고, 한계는 서버 할당량이 아니라 메모리입니다. 긴 4K 파일의 디코드 버퍼는 탭 하나를 고갈시킬 수 있으니 먼저 자르고 그다음에 크기를 줄이십시오.