'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 |
