zhuker / lamejs

mp3 encoder in javascript
Other
827 stars 199 forks source link

Bass distortion on mobile #50

Open ghost opened 6 years ago

ghost commented 6 years ago

Hi,

Love the library! Works great and haven't had any trouble getting it up and running. Recordings on desktop devices sound great! Only issue that I've encountered is that voice audio recorded on mobile devices (both Android and iOS) is about a half octave lower than real life. Do you have any idea what might be going on or how to fix the issue?

My app (still under development) is deployed at bespoke-audio.com. Feel free to login and observe the effect. I've been testing with an iPhone X and an LG Aristo (Android) and noticed it on both devices.

chrisuehlinger commented 4 years ago

Hey! I know it's been a couple years, but I just solved a similar problem and want to share my answer for future answer-googlers:

The arguments of new lamejs.Mp3Encoder() are: number of channels, sample rate, bit rate.

If you're using the default arguments in the docs (1 channel, 44100Hz sample rate, 128kbps bitrate) then your app will work fine on computers where the microphone is recording with a sample rate of 44100. However on some platforms (perhaps mobile, but I also ran into this when using a USB mic on Windows in Chrome) the sample rate is 48000Hz. In those cases, the encoder will output ~48 seconds of slowed down audio for every ~44 seconds of normal input audio, with the pitch being slightly lower as well.

You'll need to take the AudioContext you used for recording and check audioContext.sampleRate to find out what sample rate was used for recording. Set that as the sample rate for lamejs.

Note: You can't guess the sample rate from looking at the browser, OS, or anything else. It can change from one AudioContext to another even within the same browser, depending on how the user's microphone and sound drivers are configured for each microphone they have.

patrickmonteiro commented 1 year ago

@chrisuehlinger The best explanation I found on the internet. I tested your solution and it worked perfectly. Thanks!

const audioCtx = new AudioContext();

const recorder = new Recorder({
  format: 'mp3',
  bitRate: 128,
  sampleRate: audioCtx.sampleRate || 44100,
})