Celeb Glow
general | February 28, 2026

In ffmpeg, how to delay only the audio of a .mp4 video without converting the audio?

In my .mp4 file the audio delay is -3840 ms. I synced it in KMplayer, and I don't want to use MKVGUI to make a .mkv file. I just need to delay the audio by 3840 ms, everything else should be left intact.
What would be the right command to accomplish this using ffmpeg?
I would appreciate your help.

3

5 Answers

If you need to delay video by 3.84 seconds, use a command like this:

ffmpeg -i "movie.mp4" -itsoffset 3.84 -i "movie.mp4" -map 1:v -map 0:a -c copy "movie-video-delayed.mp4"

If you need to delay audio by 3.84 seconds, use a command like this:

ffmpeg -i "movie.mp4" -itsoffset 3.84 -i "movie.mp4" -map 0:v -map 1:a -c copy "movie-audio-delayed.mp4"

Make sure, that your ffmpeg build is not too old, newer than 2012 will suffice.


Explanation

-itsoffset 3.84 -i "movie.mp4"

Offsets timestamps of all streams by 3.84 seconds in the input file that follows the option (movie.mp4).

-map 1:v -map 0:a

Takes video stream from the second (delayed) input and audio stream from the first input - both inputs may of course be the same file.

A more verbose explanation can be found here:

24

Make first silence audio:

ffmpeg -f lavfi -i anullsrc=channel_layout=5.1:sample_rate=48000 -t 3 silence_3_sec.mp3

Then concat files:

ffmpeg -i "concat:silence_3_sec.mp3|input.mp3" -acodec copy out.mp3

I extracted audio with Audacity, then cut some silence (equal to delay) from end of video, and added to beginning of audio.
After doing any other adjustments to audio eg. normalization, I exported audio, and replaced audio in original via ffmpeg:

ffmpeg-i "in.mp4" -i "synced.m4a" -vcodec copy -acodec copy -map 0:0 -map 1:0 out.mp4

1

Newer versions of ffmpeg require the -map options to be located just before the output options. E.g.: ffmpeg.exe %InputOpts% -i %1 -itsoffset 1.00 -i %1 %CodecsOpts% %MapOpts% %OutputOpts%

As stated in the currently top voted answer, you can use ffmpeg's -itoffset. And acccording to the ffmpeg wiki, if you do not want to offset all streams, all you have to do is to specify the input file twice, once for the streams you want to keep as they are and once again for the streams you want to offset. And then you simply map the streams you want to the final output file. This way there is no need to extract streams and them remux them together later.

For instance (copied from the wiki), if you want all audio streams to be offset by 5 seconds

ffmpeg -i video.mp4 -itsoffset 5 -i video.mp4 -map 0:v -map 1:a out.mp4

-map 0:v will copy the video from the first input file (video.mp4)

-map 0:a will copy the audio from the second input file. Which happens to be video.mp4 too, but delayed 5 seconds by the use of -ifoffset right before the corresponding -i flag

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy