ffmpeg edit avi metadata and audio track naming

12,427

Solution 1

stream selection

Default stream selection behavior is to select one stream type per input. For example, as in your input, if it contains two audio streams, then only the stream with the most number of channels will be selected.

You can tell ffmpeg to include all streams with the -map option.

Because the -map option begins counting at 0, the 0 in this example refers to the first input (input.avi: your only input in this case). If you had additional inputs then -map 1 would refer to the second input.

set language metadata

To set the language of the first and second audio streams use the -metadata option with stream specifiers:

ffmpeg -i input.avi -map 0 -codec copy -metadata:s:a:0 language=eng -metadata:s:a:1 language=rus output.avi

See the documentation for more info.

Solution 2

Took quite a long time for me to figure this out. I'm posting it here, because even after 3 years this thread is one of the first hits in google search: AVI (more specific: RIFF) does support language names but in opposite to mkv, the metadata is not stored in the stream but in the header using tags IAS1-9 for up to 9 different audio streams.

ffmpeg -i input.avi -map 0 -codec copy -metadata IAS1=eng -metadata IAS2=ger output.avi

VLC ist pretty tolerant. If you enter ISO code "ger", VLC translates it to "Deutsch", if you enter "MyLang" instead, VLC displays "MyLang". Other software like Kodi needs the the correct ISO code. It would read "MyL" only and then display the language as unknown.

However, please be aware that ffmpeg does not just add the language but also changes other metadata. For example, audio interleave and preload data are different in output.avi, no idea if this is good or might result in audio out of sync. Check with MediaInfo or similar.

Solution 3

Use like this for AVI files

 -map 0 -acodec copy -metadata:s:a:0  title="English" -metadata:s:a:1 title="Hindi"

The title keyword does the trick

Share:
12,427

Related videos on Youtube

Davlog
Author by

Davlog

Updated on September 18, 2022

Comments

  • Davlog
    Davlog almost 2 years

    I have a bunch of movies in avi format on my disk. However, they don't contain any metadata like title etc.

    I found a command which would do it for me :

    ffmpeg -i input.avi -metadata title="Moonshine" -metadata author="Moonshine" -metadata copyright="2009" -metadata comment="foo" -acodec copy -vcodec copy output.avi
    

    This works fine BUT it will only copy ONE audio track. My files contain more than one audio track. I want ffmpeg to copy everything and just give the file a title.

    Also, is there any way to give the audio tracks a language name? For example a file contains 2 audio tracks. The first one is English and the second one is Russian. How do I name them correctly so when I use a video player it would show me in the language menu that the first one is English and the second one is Russian?

  • Peter Cordes
    Peter Cordes over 9 years
    I think avi doesn't support much if any per-stream metadata (other than the necessary technical stuff). -metadata:s:a:0 language=eng didn't do anything. (byte-identical output with/without, muxing from an input avi to an output avi, where mplayer listed the language as "unknown" in the input.) I already suspected this, so this command was very helpful to verify that avi doesn't do track names / language metadata.
  • Peter Cordes
    Peter Cordes over 9 years
    update, actually the Avi-Mux GUI manual alexander-noe.com/video/amg/en_main_window.html talks about naming streams in AVI. Maybe just not supported by ffmpeg?
  • suspectus
    suspectus almost 9 years
    Can you expand - how does this answer the question?
  • albal
    albal almost 9 years
    Also it is convention to add the whole command line including the command. When you do it is good practise to explain each parameter as @suspectus alludes to
  • JSancho
    JSancho over 4 years
    fantastic, this worked right away!