M4A 파일이 뭔가요 — 여는 법과 MP3 로 바꾸는 법 (설치 없이)
받은 파일이 .m4a 로 끝나는데 두 번 눌러도 안 열리거나, 올리려는 곳에서 MP3 만 받는다고 합니다. M4A 는 고장난 파일이 아니라 애플이 많이 쓰는 소리 담는 그릇입니다. 윈도우는 이미 이걸 읽을 수 있고, MP3 로 바꾸는 기능도 들어 있습니다. 여는 법과 바꾸는 법, 그리고 바꿀 때 용량이 실제로 어떻게 되는지 재 봤습니다.
M4A 도 그대로 끌어다 놓고 필요한 구간만 자를 수 있습니다. 파일이 서버로 올라가지 않습니다.
M4A 가 뭔가요
.m4a 는 소리를 담는 그릇의 이름입니다. 안에 든 소리는 대개 AAC 방식으로 압축돼 있습니다. 아이폰 음성 메모, 맥의 녹음, 아이튠즈에서 받은 노래가 이 형식으로 저장됩니다. 메신저로 받은 녹음이 .m4a 인 것도 보낸 쪽이 아이폰이었던 경우가 많습니다.
그릇과 내용물이 다르다는 점이 헷갈리는 지점입니다. .mp4 가 영상 그릇이라면 .m4a 는 소리만 담은 같은 계열의 그릇입니다. 그래서 이름만 .mp4 로 바꿔도 많은 재생기가 그냥 열어 줍니다 — 안쪽 구조가 같기 때문입니다. 다만 이름 바꾸기는 변환이 아니므로, MP3 만 받는 곳에서는 여전히 거부당합니다.
윈도우 10·11 은 M4A 를 그냥 재생합니다. HEIC 처럼 스토어에서 확장을 따로 설치할 필요가 없습니다. 두 번 눌러도 안 열린다면 형식을 못 읽는 게 아니라 연결된 프로그램이 없는 것입니다. 오른쪽 클릭 → 연결 프로그램 → 미디어 플레이어를 고르면 됩니다.
MP3 로 바꾸기 — 윈도우에 이미 있는 기능으로
윈도우에는 미디어 변환 기능(Media Foundation)이 들어 있고, PowerShell 로 부를 수 있습니다. 내려받을 것도 업로드할 것도 없습니다. 아래를 PowerShell 창에 붙여 넣으면 폴더 안의 M4A 가 전부 MP3 로 나옵니다.
Add-Type -AssemblyName System.Runtime.WindowsRuntime
$ms = [System.WindowsRuntimeSystemExtensions].GetMethods()
$op = ($ms | Where-Object { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -like 'IAsyncOperation*' })[0]
$ap = ($ms | Where-Object { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -like 'IAsyncActionWithProgress*' })[0]
function Wait-Op($o, $t) { $x = $op.MakeGenericMethod($t).Invoke($null, @($o)); $x.Wait(-1) | Out-Null; $x.Result }
function Wait-Act($a) { $x = $ap.MakeGenericMethod([double]).Invoke($null, @($a)); $x.Wait(-1) | Out-Null }
[Windows.Storage.StorageFile, Windows.Storage, ContentType=WindowsRuntime] | Out-Null
[Windows.Storage.StorageFolder, Windows.Storage, ContentType=WindowsRuntime] | Out-Null
[Windows.Media.MediaProperties.MediaEncodingProfile, Windows.Media, ContentType=WindowsRuntime] | Out-Null
[Windows.Media.Transcoding.MediaTranscoder, Windows.Media, ContentType=WindowsRuntime] | Out-Null
$folderPath = "C:\Users\you\Music" # .m4a 파일이 있는 폴더
$folder = Wait-Op ([Windows.Storage.StorageFolder]::GetFolderFromPathAsync($folderPath)) ([Windows.Storage.StorageFolder])
$profile = [Windows.Media.MediaProperties.MediaEncodingProfile]::CreateMp3("High")
Get-ChildItem "$folderPath\*.m4a" | ForEach-Object {
$src = Wait-Op ([Windows.Storage.StorageFile]::GetFileFromPathAsync($_.FullName)) ([Windows.Storage.StorageFile])
$dst = Wait-Op ($folder.CreateFileAsync([IO.Path]::ChangeExtension($_.Name, ".mp3"), 1)) ([Windows.Storage.StorageFile])
$t = New-Object Windows.Media.Transcoding.MediaTranscoder
$prep = Wait-Op ($t.PrepareFileTranscodeAsync($src, $dst, $profile)) ([Windows.Media.Transcoding.PrepareTranscodeResult])
if ($prep.CanTranscode) { Wait-Act ($prep.TranscodeAsync()); "$($_.Name) -> $($dst.Name)" }
else { "$($_.Name): $($prep.FailureReason)" }
}폴더 경로만 자기 것으로 바꾸면 끝입니다. 원본 .m4a 는 지워지지 않고 옆에 .mp3 가 새로 생깁니다. 바뀐 파일마다 한 줄씩 찍히고, 안 되는 파일은 이유가 대신 찍힙니다.
맨 위 Wait-Op · Wait-Act 는 군더더기처럼 보이지만 꼭 필요합니다. 변환이 비동기로 돌기 때문에, 기다리지 않으면 아직 쓰는 중인 파일을 재게 됩니다. 이 글을 쓰면서 처음에 10초짜리가 4KB 로 나온 것도 그래서였습니다.
그래서 얼마나 작아지나 — 직접 재 봤습니다
10초짜리 무압축 WAV(1,764,044바이트)를 같은 기능으로 M4A 와 MP3 로 각각 바꿔 봤습니다.
| 프리셋 | M4A 결과 | 원본 대비 |
|---|---|---|
| High | 243,233바이트 | 7.3배 작아짐 |
| Medium | 162,994바이트 | 10.8배 |
| Low | 122,926바이트 | 14.4배 |
여기서 한 가지가 분명해집니다. 용량 때문에 M4A 를 MP3 로 바꿀 이유는 없습니다. 같은 프리셋에서 둘은 0.6% 차이입니다. 바꾸는 이유는 오직 받는 쪽이 MP3 만 받을 때입니다 — 업로드 양식, 오래된 차량 오디오, 옛 MP3 플레이어 같은 경우입니다.
바꾸기 전에 알아 둘 것
손실 위에 손실입니다. M4A 는 이미 소리를 버려 가며 압축한 결과물입니다. 그걸 MP3 로 바꾸면 다시 한 번 버립니다. 원본에서 곧바로 MP3 를 뽑은 것보다 나쁠 수밖에 없습니다. 실제로 M4A(243,233바이트)를 MP3 로 바꾸니 239,471바이트가 나왔는데, 크기는 비슷해도 안쪽은 두 번 압축된 소리입니다.
되돌려도 복구되지 않습니다. M4A 를 WAV 로 바꿔 보니 1,921,106바이트가 나왔습니다. 원본 WAV 1,764,044바이트보다 오히려 큽니다. 무압축 그릇에 담으니 파일만 커졌을 뿐, 버린 소리가 돌아온 것은 아닙니다.
원본은 남겨 두세요. 다시 편집할 일이 조금이라도 있다면 M4A 를 지우지 마세요. 음성 메모처럼 다시 못 구하는 녹음이면 더더욱 그렇습니다.
구간만 필요하다면 자르는 게 먼저입니다
한 시간짜리 회의 녹음에서 쓸 곳은 2분뿐인 경우가 많습니다. 그럴 때는 형식을 바꾸기 전에 필요한 구간만 자르는 쪽이 용량을 훨씬 크게 줄입니다. 1시간을 192kbps 로 두면 80MB 가 넘지만 2분만 남기면 3MB 가 안 됩니다. 자르고 나서 바꾸는 순서가 낫습니다.
자주 묻는 질문
Q. M4A 를 그냥 MP3 로 이름만 바꾸면 안 되나요?
안 됩니다. 확장자는 이름표일 뿐이고 파일 안쪽 내용이 형식을 정합니다. 이름을 바꿔도 안은 AAC 그대로라, 형식을 검사하는 곳에서는 거부당합니다.
Q. 윈도우 10 에서도 되나요?
됩니다. 윈도우에 기본으로 들어 있는 미디어 기능을 부르는 것이라 설치할 것이 없습니다. 같은 명령을 그대로 붙여 넣으면 됩니다.
Q. M4A 가 MP3 보다 음질이 좋다던데요?
같은 비트레이트라면 일반적으로 AAC(M4A 안에 든 방식)가 유리하다고 알려져 있습니다. 다만 이 글에서 잰 윈도우 High 프리셋은 둘 다 192kbps 라 결과 크기가 거의 같았습니다. 이미 M4A 인 파일을 음질 때문에 MP3 로 바꿀 이유는 없습니다.
Q. 아이폰 음성 메모를 윈도우로 옮겼더니 안 열립니다.
형식 문제가 아니라 연결 프로그램 문제일 가능성이 큽니다. 오른쪽 클릭 → 연결 프로그램 → 미디어 플레이어를 고르면 재생됩니다. 그래도 안 되면 파일이 전송 중에 잘렸는지 크기를 확인해 보세요.
Q. 변환이 CanTranscode 에서 거짓으로 나옵니다.
코덱을 못 찾았거나 보호가 걸린 파일입니다. 아이튠즈에서 구매한 옛날 곡(.m4p)은 DRM 때문에 이 방법으로 바꿀 수 없습니다.
M4A 도 그대로 끌어다 놓고 필요한 구간만 자를 수 있습니다. 파일이 서버로 올라가지 않습니다.