2017-02-22 4 views
0

나는 mp3 또는 wav 파일에 가입하는 방법에 관한 많은 기사를 찾았지만 다른 유형의 오디오 파일을 결합하는 방법에 대해서는 찾지 못했습니다. wav 파일을 연 다음 mp3 파일을 차례로 재생하려고합니다. 를 사용하여 wav 파일을 mp3로 변환하려고했습니다.바이트 버퍼에 naudio를 사용하여 mp3 및 wav 파일을 결합하는 방법 # MVC?

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(); 
    } 

에 의해 그들에게 병합 그러나 그것은 단지 우선이 코드를 사용 part.If 재생 work.It하지 않았다.

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 헤더를 찾을 수 없습니다.

답변

1

MP3로 변환하지 마십시오. 주어진 파일 (wav의 경우 WaveFileReader, mp3의 경우 Mp3FileReader의 경우)에 적합한 리더를 작성하기 만하면됩니다. 두 등급 모두는 에서 파생되어 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(); 

행운을 빈다.

관련 문제