you can combine steps 1 and 2 into a single command: $ ffmpeg- i input -options -f wav - | lame -V 5 -F -b 128 - output.mp3
> On Jun 4, 2018, at 7:52 42AM, Zak <[email protected]> wrote: > > On 2018-06-04 at 3:03 AM EDT, [email protected] wrote: > >> Hi experts! >> >> I am currently using ffmpeg as a solution to audio file conversion and >> normalization. >> >> I understand that my setting (-q:a 5) below should produce output with >> bitrate range in between 120-150kbps, or sometimes even lower than that if >> the input already in being a lower bitrate than requested. >> >> By using VBR Encoding, is there an option that is able to constrain the >> bitrate minimum at 128kbps? >> >> ffmpeg -i "input" -af "silenceremove=0:0:0:-1:1:-80dB, >> dynaudnorm=p=1:m=3:r=1" -vn -acodec libmp3lame -q:a 5 -ar 44100 "output.mp3" >> >> Please kindly advise. Thanks! >> >> Regards, >> >> Sook Sin > > Hello Sook Sin, > > Disclamer: It might depend on your version of FFmpeg and libmp3lame, but I > doubt it (assuming versions from 2012 or more recent). The libmp3lame > behavior in this respect has been the same since at least 2012, and the > FFmpeg behavior has probably been the same in this respect. (If it changed, > it would indicate that FFmpeg removed a feature, and I don't think they did > this. There is no reason to remove features.) > > Short version: You can set a minimum bitrate in VBR mode with the LAME > command line interface, but I think you CANNOT do this with the version of > libmp3lame that is linked by FFmpeg during compilation of FFmpeg. I just > tried, the minimum bitrate was not respected, every frame of silence was > encoded at 32 kbps. A work-around is to use your FFmpeg command to make an > uncompressed PCM file, such as a WAV file, and then convert the WAV to MP3 > using the LAME command line interface (going forward, I will call it the LAME > CLI). I give an example of how to do this below. > > Question for the whole list: > Is it possible to pass arbitrary options from FFmpeg to libmp3lame as if they > came from argc and argv? I am guessing no. libx264 seems to take arbitrary > options via FFmpeg, but I am guessing libmp3lame does not. Sook Sin wants to > pass in the option "-F" as if it came from the command line. (Or rather, if > this were possible it would solve the problem at hand.) > > Why: > > In order to tell the LAME CLI to do VBR but also enforce a minimum bitrate > for all frames of MP3 audio data, you need to give the LAME CLI a command > like this (this is valid Bash syntax for GNU/Linux, MacOS, or Cygwin on > Windows): > > bash$ lame -V 5 -F -b 128 input.wav output.mp3 > > The option "-V 5" for the LAME CLI is the same as "-q:a 5" in FFmpeg, and in > fact FFmpeg passes the number 5 directly to libmp3lame to be used by > libmp3lame as it sees fit. The FFmpeg option "-q:a 5" should not be confused > with the LAME CLI option "-q 5", which is a different encoder parameter. > > The option -V (LAME) and its sister -q:a (FFmpeg) control the file size and > target bitrate. > > The option -q (LAME) and its sister -compression_level:a (FFmpeg) control how > fast or slow the encoder is. "-q 0" (LAME CLI) is equal to > "-compression_level:a 0" (FFmpeg), and it will be the slowest during > compression, equally fast during playback, and give the best-sounding > results. "-q 3" is the default in VBR mode for LAME (both CLI and > FFmpeg-linked). In CBR mode, -q 3 is often the same as -q 0, but it depends > on the sample rate of the input and the output bitrate of the MP3. For CD > audio (44.1 kHz stereo) at CBR at 320 kbps, -q 3 is actually a tiny bit > faster than -q 0. At lower bitrates they are often identical algorithms, > speed, and output. -q 0 is the highest quality and slowest compression, -q 9 > is the lowest quality and fastest, the output file sizes are generally about > the same with no systematic trend larger or smaller. > > The option -F (LAME) is the key option that you want. It means FORCE the > encoder to use frames of a certain minimum size, even if it can achieve the > target quality (implied by -V 5) using a small frame. You say -F and then you > say -b N with the frame size in kbps. So for a minimum frame size of 128 > kbps, it is the command above with "-F -b 128". This does indeed work in LAME > v3.100, I just tested it. Even silence will be 128 kbps. In fact, if I set -V > 9 (which should be about 65 kbps and should sound terrible), the whole file > is created using 128 kbps frames and the quality is much better, because 128 > kbps sounds markedly better than ~65 kbps VBR. (These examples and numbers > are all for CD audio, in which silence would normally be 32 kbps in -V N for > any value of N. Frames smaller than 32 kbps are not valid at CD sample rates > in the MP3 standard - VLC will play such files, iTunes will not. LAME CLI > will make such a file if you compile in debug mode. FFmpeg will not make such > files, as far as I know. This seems like good behavior on all accounts.) > > Sadly, you need the -F option, and FFmpeg doesn't seem to know how to accept > that option and pass it to libmp3lame. Using a realistic music file with some > silence, I was not able to get FFmpeg to respect the minimum frame size. In > VBR mode, FFmpeg wants to make 32 kbps frames if it feels like they are > high-enough quality. > > Working solution, use two steps: > > Step 1: > > bash$ ffmpeg -i foo -args -args -more_args intermediate.wav > > Step 2: > > bash$ lame -V 5 -F -b 128 intermediate.wav output.mp3 > > bash$ rm intermediate.wav > > The commands above will work assuming the FFmpeg command in step 1 works and > assuming you have a semi-recent version of LAME. I recommend the latest > version of LAME, they don't come out very often and they get progressively > better. > > Alternative solution, not as good: > > Use an ABR mode. This will give worse audio quality, and you may still get > frames smaller than 128 kbps, especially if you set the ABR target as 135 > kbps, which is the midpoint of 120-150 kbps. Let's try it: > > Oh, I actually can't get this to work. The solution likely looks like this, > kind of: > > bash$ ffmpeg -i song.wav -codec:a libmp3lame -abr:a -b:a 135k output.mp3 > > The above does not work for me, I tried a few variations and it is not valid > syntax, but I don't recommend ABR for MP3 in general, and it also probably > won't solve this problem because if the target is 135 kbps, then 32 kbps > frames are very likely to show up in the output. There just won't be as many > as -V 5. ABR at 135 kbps will likely have a huge number of 112 kbps frames, > which is already below your desired minimum. > > Note that the LAME docs imply that -F only applies to frames of silence. This > is only implied, the term "silence" is not defined rigorously, and in reality > you need the -F option if you are trying to make the MP3 play on a device or > in software that can't handle small frames. Devices or software that need a > minimum frame size really NEED a minimum frame size, even for silence. > > ABR might be a viable option if your goal is to make sure the total audio > size is predictable, or above some minimum. ABR will not give good results in > terms of audio quality, and it will use 32 kbps frames sometimes (possibly > breaking your player), but it will ensure a minimum size for the finished > audio file. If you use ABR with a target of 150 kbps, then I think it is > unlikely the finished product will average less than 128 kbps. ABR doesn't > promise to come within any margin of the target, but it comes very close > usually. > > Good luck, > > Zak F. > > > _______________________________________________ > ffmpeg-user mailing list > [email protected] > http://ffmpeg.org/mailman/listinfo/ffmpeg-user > > To unsubscribe, visit link above, or email > [email protected] with subject "unsubscribe". _______________________________________________ ffmpeg-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/ffmpeg-user To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
