26 January 2026 | 6 min read
Timecode in WAV files: how it is stored and why it drifts
Most sync failures are not sync failures. They are frame rate misunderstandings, and you can spot them before the assembly starts.
Timecode is the contract between camera and sound. When it holds, syncing a day of rushes takes minutes. When it slips, an assistant spends an afternoon nudging clips. Understanding how timecode lives inside a WAV file makes the difference between the two.
Timecode is stored as a sample count
Inside a BWF file, the bext chunk has a field called time reference. It contains the number of samples elapsed since midnight at the start of the file. At 48 kHz, one hour equals 172,800,000 samples.
There is no frame rate in that number. The frame rate lives separately, usually in the iXML chunk. Your NLE combines the two to display 10:14:22:17. If the project frame rate and the file frame rate disagree, the display is wrong even though the audio data is perfect.
Where drift really comes from
- Frame rate mismatch, for example 23.976 material read as 24, which drifts about 3.6 seconds per hour.
- A recorder jam synced hours earlier with a cheap internal clock, drifting a frame or two over a long day.
- Camera timecode free running while the recorder is record run, so only the start points agree.
- Sample rate pull up or pull down applied on one side and not the other.
Check before you sync, not after
Two minutes of checking saves hours. Open one sound file and one camera file from the same take and compare start timecode, frame rate and sample rate. If the sound file says 48 kHz and the camera audio says 48.048 kHz, you have a pull issue and no amount of manual nudging will fix it cleanly.
The audio inspector on this site shows the timecode stamp, sample rate, bit depth and frame rate flags of a WAV locally in your browser, which is a fast way to triage a card before it goes anywhere near an edit suite.
When there is no timecode at all
Files recorded on a camera, a phone or a small handheld often have no time reference. In that case sync on waveform, on a clap, or on the plosive of the first line. Once the take is aligned you can bake a new timecode reference into the deliverable if the pipeline needs it.
Practical habits that prevent trouble
- Jam sync every few hours, and always after a battery swap.
- Record a slate even when timecode is running. It costs one second and rescues whole scenes.
- Never re-encode sound rushes before sync. Re-encoding strips the time reference.
- Agree the frame rate in writing with post before day one.