vikas
vikas

Reputation: 1

Webm to wav to Mp3 conversion results in incorrect (increased) track length using NAudio.Lame

I am using below code to convert webm audio content (audio recorded by web browser using MediaRecorder) to wave and then to mp3, using NAudio.Wave and NAudio.Lame. The issue is with mp3 track length, it is more than the original recorded audio length by few seconds (with LAMEPreset.ABR_64) to by few minutes (with LAMEPreset.VBR_90) for 15 minutes of original audio. In windows media player, the mp3 file plays ok till the actual length of audio and then suddenly seeks to end.

using NAudio.Wave;
using NAudio.Lame;

public async Task<MemoryStream> GetAudioStreamById(int audioId)
{
    //audiStream is the already saved webm audio stream
    using (var audioStream = await _audioContentRawService.GetAudioContentRawAsync(audioId))
    {
        using (var nAudioStreamMediaFoundationReader = new StreamMediaFoundationReader(audioStream))
        using (var wavStream = new MemoryStream())
        {
            //Step 1: Convert the audio to wav format
            WaveFileWriter.WriteWavFileToStream(wavStream, nAudioStreamMediaFoundationReader);
            var config = new LameConfig()
            {
                WriteVBRTag = true,
                Preset = LAMEPreset.VBR_90
            };
            //Step 2: Convert the wav audio to 16Khz, 16 bit, mono channel, Pcm
            using (var nAudioStreamMediaFoundationReader2 = new StreamMediaFoundationReader(wavStream))
            using (var nAudioWaveFormatConversionStream = new WaveFormatConversionStream(new WaveFormat(16000, 16, 1), nAudioStreamMediaFoundationReader2))
            using (var nAudioPcmWavStream = WaveFormatConversionStream.CreatePcmStream(nAudioWaveFormatConversionStream))
            using (var mp3Streamvbr = new MemoryStream())
            using (var mp3StreamWritervbr = new LameMP3FileWriter(mp3Streamvbr, new WaveFormat(16000, 16, 1), config))
            using (var pcmWavStream = new MemoryStream())
            {
                await nAudioPcmWavStream.CopyToAsync(pcmWavStream);
                pcmWavStream.CopyTo(mp3StreamWritervbr);
                var filePathmp3vbr = Path.Combine("C:/Temp/", $"audio_vbr90_{audioId}.mp3");

                using (var fileStreammp3vbr = new FileStream(filePathmp3vbr, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    await fileStreammp3vbr.WriteAsync(mp3Streamvbr.ToArray());
                }

                return pcmWavStream;
            }
        }
    }
}

I tried various LAMEPresets to see what works, in general the abr presets gives closer to original track length (still more by few seconds). With vbr presets it is more difference. Also if bitrate is provided instead of preset e.g. 128 it is much closer to original track length. Also tried setting WriteVBRTag as in above code but no luck! It will be great help to know how to keep the mp3 track length as close to original webm track length.

Upvotes: 0

Views: 38

Answers (0)

Related Questions