Game Audio Format: WAV vs OGG, 48 kHz for Unity, Unreal & Godot
Game engines are forgiving about what you import and unforgiving about what it costs at runtime. A 96 kHz stereo WAV footstep will play fine in Unity, Unreal or Godot — it will also be resampled on every trigger, take ten times the memory it needs, and bloat the build. Getting the format right before import is a two-minute job that saves you from chasing audio pops and load stutter later.
The short answer
- Sample rate: 48 kHz for everything. 44.1 kHz is fine too — just pick one and never mix them.
- Bit depth: 16-bit. 24-bit buys nothing once the engine mixes to its output.
- Short SFX (footsteps, UI, impacts, weapons): WAV, mono.
- Music and long ambience: OGG Vorbis, stereo, quality 5–7 (roughly 160–224 kbps).
- Voice / dialogue: OGG or engine-compressed, mono.
- Trim silence from the start of every SFX. Leading silence is the number-one cause of “laggy” sounds.
Why 48 kHz, and why consistency matters more than the number
Almost every playback device — Windows, macOS, Android, iOS, consoles, HDMI — runs its audio output at 48 kHz. If your clips are 44.1 kHz the engine resamples every one of them at runtime. It's cheap, but it isn't free, and on a mobile target with dozens of simultaneous voices it adds up. 48 kHz sidesteps it entirely.
What actually causes trouble is mixingrates: a 44.1 kHz music track under 48 kHz effects, or one 22.05 kHz legacy clip in a 48 kHz project. Pick a project rate, put it in your import checklist, and convert anything that doesn't match before it goes into the assets folder.
WAV vs OGG: it's about decode cost, not quality
WAV is uncompressed, so the engine can play it the instant it's triggered. OGG has to be decoded, which costs a little CPU each time the clip starts. For a footstep that fires twenty times a second in a crowd scene, that matters. For a three-minute music loop that starts once, it doesn't — and the OGG is a tenth of the size.
Rule of thumb: under about ten seconds and played often → WAV. Over that, or played rarely → OGG. Engines add their own compression on top of this (see the table), so “WAV in the project” doesn't always mean “WAV in the build”.
Mono for anything positioned in 3D
A sound placed in the world — a gunshot, a door, an NPC line — should be mono. The engine spatialises it by panning and attenuating a single channel; a stereo source gets collapsed or, worse, plays wide no matter where it is. Keep stereo for music, UI stingers and non-diegetic ambience beds. Converting SFX to mono also halves their memory footprint. The Mono/Stereo Converter does this in one step.
Engine specifics
| Engine | Import formats | Recommended source | Notes |
|---|---|---|---|
| Unity | WAV, AIFF, OGG, MP3, FLAC | 48 kHz 16-bit WAV (SFX), OGG (music) | Set short SFX to Decompress On Load + PCM/ADPCM; music to Streaming + Vorbis. Import settings override the source format. |
| Unreal Engine | WAV (16-bit PCM), OGG, FLAC, AIFF | 48 kHz 16-bit WAV for everything | Unreal compresses on cook (Bink/ADPCM/Vorbis per platform). Importing 24-bit or 32-bit float WAV can fail on older versions — export 16-bit. |
| Godot | WAV, OGG Vorbis, MP3 | WAV (SFX), OGG (music) | WAV imports with optional IMA-ADPCM compression and a “Force mono” toggle. OGG supports loop points natively. |
| GameMaker | WAV, OGG, MP3 | WAV (SFX), OGG (music) | “Uncompressed” = WAV in memory; “Compressed – Streamed” for music. |
| Web (HTML5 / Phaser / Three.js) | OGG, MP3, WAV, AAC | OGG + MP3 fallback | Safari historically lacked OGG; ship both and let the browser pick. |
Batch-prepping a folder of sounds
- Trim leading silence on each SFX with the Audio Trimmer. Even 20 ms of silence reads as input lag.
- Mono for positional SFX via the Mono/Stereo Converter.
- Resample to 48 kHz, 16-bit with the Sample Rate Converter. Do this last so the earlier steps run on the original.
- Music and ambience to OGG with the Audio Converter. Keep a WAV master outside the project.
- Level-match with the Loudness Normalizerso you're not fighting volume sliders in the mixer — around −16 LUFS for music beds, −12 to −10 for SFX, peaks at −1 dBTP.
Common problems and the format fix
- Clicks or pops at the start — the file doesn't start at a zero crossing, or the engine is resampling. Trim to a zero crossing and match the project rate.
- Sound plays late — leading silence, or a compressed clip set to stream. Trim, and set short SFX to decompress on load.
- Positional sound isn't panning — the source is stereo. Convert to mono.
- Import fails in Unreal — 24/32-bit or float WAV. Export 16-bit PCM.
- Build size exploded — music stored as WAV. Convert to OGG and set to streaming.
- Loop has a gap — MP3 adds encoder padding; use OGG or WAV for loops.