如何使用 naudio 将 mp3 和 wav 文件加入字节缓冲区 c# MVC?
How to join mp3 and wav files using naudio to byte buffer c# MVC?
我找到了很多关于如何加入 mp3 或 wav 文件的文章,但是我没有找到任何关于如何加入不同的音频文件的文章 types.I 想播放 wav 文件然后播放 mp3 文件,一个一个接一个。
我试图通过使用将 wav 文件转换为 mp3。
private static MemoryStream ConvertWavToMp3(string path)
{
if (File.Exists(path))
{
MemoryStream stream = new MemoryStream();
using (WaveFileReader rdr = new WaveFileReader(path))
using (LameMP3FileWriter wtr = new LameMP3FileWriter(stream, rdr.WaveFormat, 320))
{
rdr.CopyTo(wtr);
return stream;
}
}
else
{
return null;
}
}
}
我通过以下代码从 mp3 文件中获取字节。
private static MemoryStream GetBytesFromMp3(string path)
{
string storageName = path.Substring(path.IndexOf("\\") + 2, path.IndexOf("\", 3) - path.IndexOf("\\") - 2);
string networkShare = path.Substring(0, path.LastIndexOf("\"));
NetworkCredential credentials = new NetworkCredential(ConfigurationManager.AppSettings[storageName + "_User"], ConfigurationManager.AppSettings[storageName + "_Pass"]);
using (new NetworkConnection(networkShare, credentials))
{
if (File.Exists(path))
{
using (Mp3FileReader rdr = new Mp3FileReader(path,FileMode.OpenOrCreate))
{
byte[] result = new byte[rdr.Length];
rdr.Read(result, 0, result.Length);
int a = result.Max();
MemoryStream stream = new MemoryStream(result);
return stream;
}
}
else
{
return null;
}
}
}
然后合并它们
通过
public static byte[] JoinFiles(List<FileWeb> files)
{
MemoryStream output = new MemoryStream();
int offset = 0;
foreach (FileWeb file in files)
{
MemoryStream mp3Data;
string fullPath = file.FilePath + "\" + file.FileName;
if (file.FileName.EndsWith("wav"))
{
mp3Data = ConvertWavToMp3(fullPath);
}
else
{
mp3Data = GetBytesFromMp3(fullPath);
}
if (mp3Data != null)
{
byte[] buffer = mp3Data.ToArray();
output.Write(buffer, offset, buffer.Length - offset);
offset = 4;
}
}
return output.ToArray();
}
但它没有 work.It 只先播放 part.If 我使用此代码。
public static void Combine(string[] inputFiles, Stream output)
{
foreach (string file in inputFiles)
{
Mp3FileReader reader = new Mp3FileReader(stream);
if ((output.Position == 0) && (reader.Id3v2Tag != null))
{
output.Write(reader.Id3v2Tag.RawData, 0, reader.Id3v2Tag.RawData.Length);
}
Mp3Frame frame;
while ((frame = reader.ReadNextFrame()) != null)
{
output.Write(frame.RawData, 0, frame.RawData.Length);
}
}
}
在 Mp3FileReader reader = new Mp3FileReader(stream)
我收到错误消息,没有找到 mp3 header。
请勿将任何内容转换为 MP3。只需为给定文件创建适当的 reader(WaveFileReader
用于 wav
,Mp3FileReader
用于 mp3
)。 类 都派生自 WaveStream
,它提供了 Read
方法。使用该方法检索 未压缩的 数据。现在您可以轻松合并两个流。当然WaveFormat
必须匹配。
但你不需要重新发明轮子。内置串联机制。
var wavReader = new WaveFileReader ("file.wav");
var mp3Reader = new Mp3FileReader ("file.mp3");
// convert to different interface
var wavProvider = wavReader.ToSampleProvider ();
var mp3Provider = mp3Reader.ToSampleProvider ();
// Must all share the same sample rate and channel count
var merged = new ConcatenatingSampleProvider (new[] { wavProvider, mp3Provider });
var output = new WasapiOut ();
output.Init (merged);
output.Play ();
Console.ReadKey ();
祝你好运。
我找到了很多关于如何加入 mp3 或 wav 文件的文章,但是我没有找到任何关于如何加入不同的音频文件的文章 types.I 想播放 wav 文件然后播放 mp3 文件,一个一个接一个。 我试图通过使用将 wav 文件转换为 mp3。
private static MemoryStream ConvertWavToMp3(string path)
{
if (File.Exists(path))
{
MemoryStream stream = new MemoryStream();
using (WaveFileReader rdr = new WaveFileReader(path))
using (LameMP3FileWriter wtr = new LameMP3FileWriter(stream, rdr.WaveFormat, 320))
{
rdr.CopyTo(wtr);
return stream;
}
}
else
{
return null;
}
}
}
我通过以下代码从 mp3 文件中获取字节。
private static MemoryStream GetBytesFromMp3(string path)
{
string storageName = path.Substring(path.IndexOf("\\") + 2, path.IndexOf("\", 3) - path.IndexOf("\\") - 2);
string networkShare = path.Substring(0, path.LastIndexOf("\"));
NetworkCredential credentials = new NetworkCredential(ConfigurationManager.AppSettings[storageName + "_User"], ConfigurationManager.AppSettings[storageName + "_Pass"]);
using (new NetworkConnection(networkShare, credentials))
{
if (File.Exists(path))
{
using (Mp3FileReader rdr = new Mp3FileReader(path,FileMode.OpenOrCreate))
{
byte[] result = new byte[rdr.Length];
rdr.Read(result, 0, result.Length);
int a = result.Max();
MemoryStream stream = new MemoryStream(result);
return stream;
}
}
else
{
return null;
}
}
}
然后合并它们 通过
public static byte[] JoinFiles(List<FileWeb> files)
{
MemoryStream output = new MemoryStream();
int offset = 0;
foreach (FileWeb file in files)
{
MemoryStream mp3Data;
string fullPath = file.FilePath + "\" + file.FileName;
if (file.FileName.EndsWith("wav"))
{
mp3Data = ConvertWavToMp3(fullPath);
}
else
{
mp3Data = GetBytesFromMp3(fullPath);
}
if (mp3Data != null)
{
byte[] buffer = mp3Data.ToArray();
output.Write(buffer, offset, buffer.Length - offset);
offset = 4;
}
}
return output.ToArray();
}
但它没有 work.It 只先播放 part.If 我使用此代码。
public static void Combine(string[] inputFiles, Stream output)
{
foreach (string file in inputFiles)
{
Mp3FileReader reader = new Mp3FileReader(stream);
if ((output.Position == 0) && (reader.Id3v2Tag != null))
{
output.Write(reader.Id3v2Tag.RawData, 0, reader.Id3v2Tag.RawData.Length);
}
Mp3Frame frame;
while ((frame = reader.ReadNextFrame()) != null)
{
output.Write(frame.RawData, 0, frame.RawData.Length);
}
}
}
在 Mp3FileReader reader = new Mp3FileReader(stream)
我收到错误消息,没有找到 mp3 header。
请勿将任何内容转换为 MP3。只需为给定文件创建适当的 reader(WaveFileReader
用于 wav
,Mp3FileReader
用于 mp3
)。 类 都派生自 WaveStream
,它提供了 Read
方法。使用该方法检索 未压缩的 数据。现在您可以轻松合并两个流。当然WaveFormat
必须匹配。
但你不需要重新发明轮子。内置串联机制。
var wavReader = new WaveFileReader ("file.wav");
var mp3Reader = new Mp3FileReader ("file.mp3");
// convert to different interface
var wavProvider = wavReader.ToSampleProvider ();
var mp3Provider = mp3Reader.ToSampleProvider ();
// Must all share the same sample rate and channel count
var merged = new ConcatenatingSampleProvider (new[] { wavProvider, mp3Provider });
var output = new WasapiOut ();
output.Init (merged);
output.Play ();
Console.ReadKey ();
祝你好运。