After an FFmpeg conversion, the video may play with no sound, or a file that had several audio tracks may now have only one. There are four main causes. Check the file with ffprobe first, then go through the causes one by one.

You can almost always find the cause by asking three questions, in this order: Does the input have audio? Does your command tell FFmpeg to output it? Can the output container hold that audio codec?

First, Check with ffprobe

Make sure the input has an audio track at all. If it does not, no change to the FFmpeg command will produce sound. This command lists only the audio streams:

ffprobe -v error -select_streams a -show_entries stream=index,codec_name,channels -of csv input.mp4

Example output:

stream,1,aac,2

Here there is one audio track: index 1, codec aac, 2 channels. A file with several audio tracks shows one line per track.

stream,1,aac,2
stream,2,ac3,6

If nothing is shown, the input has no audio track. The problem is in the source file, so use a different input or add a silent track.

  • Audio track present → the problem is on the output side; see Causes 1–4 below
  • No audio track → the input itself has no audio (not an FFmpeg problem)

Once you know the input has audio, a quick test is to keep every video and audio stream in the output:

ffmpeg -i input.mp4 -map 0:v -map 0:a -c copy output.mkv

-map 0:v -map 0:a selects every video and audio stream in input 0, and -c copy copies them without re-encoding. This shows whether FFmpeg is dropping the audio or the input never had it. If the audio is in this output, run the ffprobe command above on your original output. If it lists no audio stream, your original command dropped it. If it lists one, see Causes 3 and 4. Do not use -map 0 here: it also takes subtitle and data tracks, such as MP4 subtitles or a camera’s timecode track. MKV cannot hold those as they are, so the copy stops with an error.

Cause 1: A Forgotten -map Entry

If you use no -map at all, FFmpeg picks the “best” stream of each type by itself. Usually that is one video and one audio stream, so the sound is kept.

The trouble starts when you map only some streams. As soon as you add one -map, automatic selection turns off and only the streams you mapped are output. If you map only the video, as below, the audio is dropped.

# Bad: only the video is mapped → audio disappears
ffmpeg -i input.mp4 -map 0:v:0 -c copy output.mp4

Add a map for the audio. This command maps the video and all audio streams:

ffmpeg -i input.mp4 -map 0:v -map 0:a -c copy output.mp4
  • -map 0:v: all video streams from input 0
  • -map 0:a: all audio streams from input 0

Once you use -map, list every stream you need. If you map the video, also map the audio and subtitles.

Cause 2: Removed with -an

-an means “no audio”: it tells FFmpeg not to output audio. Before the output file name, it removes the audio from that output. Before -i, it drops the audio of that input.

# Bad: -an is present, so no audio comes out
ffmpeg -i input.mp4 -an -c:v libx264 output.mp4

This usually happens when you copy an old command or script that was written for a silent video. Remove the -an:

ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4

-vn (no video) does the same for video. It is used to extract only the audio, so if your video disappeared, look for a stray -vn. Check the whole command for an -an or -vn you did not mean to include.

Cause 3: Container-Incompatible Codec

This cause is the easiest to miss. -c copy (stream copy) is fast and keeps full quality, but if the output container does not support the audio codec, FFmpeg stops with an error (Could not find tag for codec … not currently supported in container) and the conversion fails. Even when the container accepts the codec, you hear nothing if the player cannot play that codec.

A common case is Opus or Vorbis audio in MP4. WebM files often have Opus audio. FFmpeg 8.1 copies both Opus and Vorbis into MP4, but a player without Opus-in-MP4 support plays no sound, and Vorbis in MP4 is non-standard. If the video is VP8, the copy itself fails with an error.

# Caution: copying WebM straight into MP4 — fails if the video is VP8; Opus/Vorbis gets in but is silent where the player lacks support
ffmpeg -i input.webm -c copy output.mp4

If MP4 already supports the video codec (H.264, H.265, VP9 or AV1), re-encode only the audio to a codec that plays well in MP4. For MP4, AAC is the safe choice.

ffmpeg -i input.webm -c:v copy -c:a aac output.mp4
  • -c:v copy: copy the video (no quality loss, fast)
  • -c:a aac: re-encode only the audio to AAC so it plays reliably in MP4

-c:v copy only works with video codecs that MP4 supports, like those above. Older VP8 WebM video cannot be copied into MP4, so re-encode the video too: ffmpeg -i input.webm -c:v libx264 -crf 20 -c:a aac output.mp4.

A rough guide to which audio codecs each container handles:

Container Audio codecs that work well Notes
MP4 AAC / MP3 / AC3 Opus can be copied in, but players without support play no sound. If unsure, re-encode to AAC
MKV Almost anything (AAC/Opus/Vorbis/FLAC/AC3…) If unsure, switch to MKV; -c copy usually works
WebM Opus / Vorbis Video is VP8/VP9/AV1

If you want -c copy to work without re-encoding, an MKV output is the most reliable choice. MKV takes most audio codecs as they are. Re-encode the audio to AAC only when you need MP4.

Cause 4: Only One of Multiple Audio Tracks

When the input has several audio tracks (for example Japanese and English), the automatic selection that FFmpeg uses without -map picks only one audio track. It is not always the first: FFmpeg prefers a track marked as default, and otherwise takes the one with the most channels. The English or second-language audio then goes missing.

Check the tracks with ffprobe, then pick one of the following.

To keep every audio track, map all video and audio streams:

ffmpeg -i input.mp4 -map 0:v -map 0:a -c copy output.mkv

To keep only some tracks, map them with stream specifiers. For example, the first video and the second audio track:

ffmpeg -i input.mkv -map 0:v:0 -map 0:a:1 -c copy output.mp4
  • -map 0:v:0: the first video stream of input 0
  • -map 0:a:1: the second audio stream of input 0 (counting starts at 0)

With several audio tracks, remember that only one is kept by default, and list the ones you need with -map. For more, see Working with Multiple Audio Tracks.

How to Read Stream Specifiers

Notation like 0:a:1 in -map is called a stream specifier. Once you can read it, you can fix most audio problems yourself.

0  :  a  :  1
↑     ↑     ↑
input  type  index within that type (0-based)
number
  • First number: the input file (0, 1, 2… in the order of the -i options)
  • Middle letter: the stream type (v = video, a = audio, s = subtitle)
  • Last number: which stream of that type (counting from 0)

Examples:

Specifier Meaning
0:v:0 The first video stream of the first input
0:a:1 The second audio stream of the first input
0:a All audio streams of the first input
1:a:0 The first audio stream of the second input

Note that counting starts at 0. The second audio track is 0:a:1, not 0:a:2. The index that ffprobe shows counts all streams in the file (video, audio and subtitles together), so it is not the per-type number used in -map. The a:N in a specifier means “audio stream number N, counting from 0.” For more on choosing streams, see Stream Mapping.

FAQ

ffprobe shows audio, but it disappears in the output

The problem is almost certainly on the output side. Check in this order: ① you use -map but forgot the audio map, ② an -an slipped in, ③ the player cannot play the audio codec in the output (such as Opus in MP4). Running ffmpeg -i input.mp4 -map 0:v -map 0:a -c copy output.mkv first, to keep every video and audio stream, narrows it down quickly.

After making it MP4 there’s no sound, but with MKV there is

Your player most likely cannot play the audio codec inside the MP4. Opus or Vorbis audio can be copied into MP4, but a player that does not support that codec in MP4 plays no sound. Re-encode only the audio to AAC: ffmpeg -i input.webm -c:v copy -c:a aac output.mp4. To avoid re-encoding, output MKV instead; -c copy often works then.

My bilingual video only keeps one of the audio tracks

Without -map, FFmpeg keeps only one audio track. To keep them all, use -map 0. To keep only some, list each one, including the video: -map 0:v -map 0:a:0 -map 0:a:1 (without -map 0:v the video is dropped). The ffprobe command at the top shows which track has which number.

Is “the second audio” 0:a:2?

No, it is 0:a:1. Stream specifiers count from 0, so the first audio track is 0:a:0 and the second is 0:a:1. The index that ffprobe shows is a different number: it counts every stream in the file.