'Why convert wav to mp3 get different length

I use NAudio and NAudio.Lame to convert a wav file to mp3 file,code like that:

using var reader = new WaveFileReader(file);
using var ms = new MemoryStream();
var writer = new LameMP3FileWriter(ms, reader.WaveFormat, 32);
reader.CopyTo(writer);
writer.Flush();
File.WriteAllBytes(file.Replace("wav", "mp3"), ms.ToArray());

the wav file length is 1500ms,but the mp3 file length is 1557ms.

And I do the same thing by using ffmpeg.exe,command like that:

ffmpeg -i c:\2\xxx.wav c:\2\xxx.mp3

the output info:

ffmpeg version 5.0.1-essentials_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 11.2.0 (Rev7, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Guessed Channel Layout for Input Stream #0.0 : mono
Input #0, wav, from 'c:\2\xxx.wav':
  Duration: 00:00:01.50, bitrate: 768 kb/s
  Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, mono, s16, 768 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (pcm_s16le (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
Output #0, mp3, to 'c:\2\xxx.mp3':
  Metadata:
    TSSE            : Lavf59.16.100
  Stream #0:0: Audio: mp3, 48000 Hz, mono, s16p
    Metadata:
      encoder         : Lavc59.18.100 libmp3lame
size=      12kB time=00:00:01.51 bitrate=  66.2kbits/s speed= 137x
video:0kB audio:12kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.928711%

And I get a mp3 file which length is 1536ms. So,why the length changed? Thanks for reading.



Solution 1:[1]

I think Mokubai's comment will useful to you.

And I also have tried to do some test in this case. Can't reproduce the issue. If you want more help, you can leave message under Mark Heath's latest answer. He is an expert at NAudio.


My test code

using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Azure.Storage.Blobs;
using IdentityModel.Client;
using NAudio.Lame;
using NAudio.Wave;
using Newtonsoft.Json.Linq;

namespace ClientCredentialsConsoleApp
{
    public class Program
    {
        public static async Task Main(string[] args)
        {
            var tempAudioUrl = "https://****/file_example_WAV_10MG.wav";
            var audioFile = await AudioConverter.ConvertToMp3Async_YourCode(new Uri(string.Format(tempAudioUrl)));
            File.WriteAllBytes("wav" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".mp3", audioFile);

        }
       
    }
    public static class AudioConverter
    {
        public static async Task<byte[]> ConvertToMp3Async(Uri uri)
        {
            using (var client = new WebClient())
            {
                var file = await client.DownloadDataTaskAsync(uri);
                var target = new WaveFormat(8000, 16, 1);
                using (var outPutStream = new MemoryStream())
                using (var waveStream = new WaveFileReader(new MemoryStream(file)))
                using (var conversionStream = new WaveFormatConversionStream(target, waveStream))
                using (var writer = new LameMP3FileWriter(outPutStream, conversionStream.WaveFormat, 32, null))
                {
                    conversionStream.CopyTo(writer);

                    return outPutStream.ToArray();
                }

            }
        }
        public static async Task<byte[]> ConvertToMp3Async_YourCode(Uri uri)
        {
            using (var client = new WebClient())
            {
                
                var file = await client.DownloadDataTaskAsync(uri);
                using var reader = new WaveFileReader(new MemoryStream(file));
                Console.WriteLine("wav time is :"+reader.TotalTime);
                var ms = new MemoryStream();
                //var writer = new LameMP3FileWriter(ms, reader.WaveFormat, 32)
                using (var writer = new LameMP3FileWriter(ms, reader.WaveFormat, 32))
                {
                    reader.CopyTo(writer);

                    return ms.ToArray();
                }
                //reader.CopyTo(writer);
                //writer.Flush();
                //File.WriteAllBytes("wav"+DateTime.Now.ToString("yyyyMMddHH:mm:ss")+ ".mp3", ms.ToArray());

            }
        }
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Jason