Why this may be needed?
For example, you don’t know the name of a music artist who sounds in a video. Then, you can extract audio track from the video and upload it in some services to define music.
And what if the sound in the video in a good quality? Then we can extract this audio without sacrificing quality, without re-encoding.
This is a very useful trick, especially for Linux users. Having mastered this method once, we can use it at anytime we want. It doesn’t require any huge programs. ffmpeg libraries are used in many media players, so maybe you already have it installed on your Linux system as dependencies for applications.
Note that ffmpeg is available on many systems, including Windows.
Extract audio without loss of quality
How it works? Why there is no loss of quality? The fact is that this method simply copies the audio track from the video into a separate audio file. Therefore, there is no encoding here. This method is the fastest and highest in quality.
From .mp4 videos
In .mp4 video files audio track is often presented as AAC stream. So, the file extension of the output file can be .mp4, .m4a, .3gp.
The example below saves the audio track in .m4a format, but you can use all formats listed above
ffmpeg -hide_banner -i video.mp4 -vn -c:a copy audio.m4a
What do these parameters mean?
-hide_banner in simple terms means to hide the extra information
-i determines our input file
-vn means “no video”, so the video track will not be present in the output file
-c:a copy means to copy the audio track in its codec(without re-encoding)
audio.m4a is our output file(audio track)
From .webm videos
In .webm container audio stream can be presented in opus(more modern) or in vorbis codec. But they both can use .ogg container.
So, we can confidently use the following command:
ffmpeg -hide_banner -i video.webm -vn -c:a copy audio.ogg
This will save our audio track in .ogg format. This format is supported by all modern media players.
What if there are several audio tracks in a video?
We can choose which audio track we want to save. To do it, we need to add another option. It is -map option.
ffmpeg -hide_banner -i video.mp4 -map 0:a:1 -vn -c:a copy second_audio_track.mp4
What is -map 0:a:1 means?
The “0” (zero) means first file listed by -i option, so in our case it means “video.mp4” file.
Next, “a” means audio track. So, we choose between audio tracks in this file.
Next, “1” means second audio track(NOT FIRST!) since numbering starts from ZERO. So, if we want to choose third audio track then it must be -map 0:a:2!
How to show audio codec used in a video
We may encounter another codec that is used in a video, so it may use a different format. It may be important for the correct work of the media player.
Therefore, if we are unsure of the audio codec used in a video, use the following command
ffmpeg -hide_banner -i video.webm ... Stream #0:0: Video: vp8, yuv420p(progressive), 1280x720, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 1k tbn, 1k tbc (default) Stream #0:1: Audio: vorbis, 44100 Hz, stereo, fltp (default)
Like this! So our audio file is presented in vorbis codec, so we can use .ogg format for it!
Extract audio track to other formats with loss of quality
If you want to convert audio tracks from video to other formats, then be sure that the loss of quality in theory will be. But in reality, it may be insignificant, especially if we use large bitrates.
ffmpeg -hide_banner -i video.mp4 -vn -b:a 320K audio.mp3
This will make the audio track in mp3 format with 320 kbps bitrate.
Or we can choose the codec manually.
ffmpeg -hide_banner -i video.mp4 -vn -c:a libmp3lame -q:a 0 audio.mp3
It matters when a container supports several types of codecs. Then you need to specify yourself. Otherwise, ffmpeg will use the default codec for the specified container format (such as .mp4 -> aac, .webm -> opus, .mkv -> aac).
What is -q:a 0 means? It enable variable bitrate mode. So, bitrate will change dynamically. -q:a must be set from 0 to 6. In the case of the libmp3lame codec seems like the lowest value means the better quality and higher bitrate. But in the case of other codecs in may differ. For example, for vorbis codec the higher value means the higher bitrate. In my opinion, it is better to use -q:a option because it increases the quality and well distributes the bitrate across the track.
Show all available audio codecs for encoding
We can find what codecs are available, use following command
ffmpeg -hide_banner -encoders | grep "A\.\." ... A..... aac AAC (Advanced Audio Coding) A..... flac FLAC (Free Lossless Audio Codec) A..... libopus libopus Opus (codec opus) A..... libmp3lame libmp3lame MP3 (MPEG audio layer 3) (codec mp3) A..... libvorbis libvorbis (codec vorbis) ...
See this second column? These are the names of codecs for use in ffmpeg. We can pass these values to the -c:a option to specify our codec. Like that
ffmpeg some_options -c:a libopus some_options output_file
In addition, here is a simple table that will help you
Now that’s all. Thanks for attention. Ask questions in the comments.