2013-05-14 2 views
1

지난주에 C#으로 프로젝트 용으로 만든 기존 Matlab 8 밴드 이퀄라이저 GUI를 다시 구현하려고합니다. Matlab에서 노래는 동적 배열로 메모리에로드됩니다. 메모리에서 곡을 자유롭게 조작하고 재생할 수 있습니다 (배열).NAudio를 사용하여 Mp3을 배열로 조작

편리하게 이미 Mp3 추출기, 플레이어 및 둘 다 회선과 FFT가 정의 된 NAudio 라이브러리를 찾았습니다. 나는 MP3를 열어 모든 데이터를 배열로 읽을 수 있었지만 (비록 그것이 올바르지는 않을지라도 나는 올바르게 그것에 관해 갈 것이다.) 그러나 몇 가지 예제를 살펴본 후에도, 나는 어떻게 배열을 가져 와서 제대로 재생할 수있는 방식으로 스트림에 다시 씁니다 (필자는 파일에 쓸 필요가 없습니다). 내가, 내가 이렇게 내 MP3 파일의 읽기 발견 된 예는 다음

:

private byte[] CreateInputStream(string fileName) 
    { 
     byte[] stream; 
     if (fileName.EndsWith(".mp3")) 
     { 
      WaveStream mp3Reader = new Mp3FileReader(fileName); 
      songFormat = mp3Reader.WaveFormat; // songFormat is a class field 
      long sizeOfStream = mp3Reader.Length; 
      stream = new byte[sizeOfStream]; 
      mp3Reader.Read(stream, 0, (int) sizeOfStream); 
     } 
     else 
     { 
      throw new InvalidOperationException("Unsupported Exception"); 
     } 
     return stream; 
    } 

지금은이 아마도 내가 통해 실행으로 결국 비밀 그래서 수레을하려는 원시 오디오 데이터를 포함하는 바이트의 배열 DSP 모듈 그러나 지금 당장은 바이트 배열을 재생할 수 있는지 알아보기 위해 노력하고 있습니다.

 Stream outstream = new MemoryStream(stream); 
     WaveFileWriter wfr = new WaveFileWriter(outstream, songFormat); 
     // outputStream is an array of bytes and a class variable 
     wfr.Write(outputStream, 0, (int)outputStream.Length); 
     WaveFileReader wr = new WaveFileReader(outstream); 
     volumeStream = new WaveChannel32(wr); 
     waveOutDevice.Init(volumeStream); 
     waveOutDevice.Play(); 

지금은 스트림 끝을지나 읽을 수 없다는 WaveFileReader (outstream)에서 발생하는 오류가 발생합니다. 나는 그것이 내가 올바르게하고있는 것이 아니라는 것을 의심한다. 어떤 통찰력?

답변

1

WaveFileWriter을 절대로 닫지 않아 코드가 작동하지 않아 해당 헤더가 올바르게 기록되지 않으며 MemoryStream을 되 감을 필요가 있습니다.

그러나 Bye 배열을 재생하려면 WAV 파일을 작성할 필요가 없습니다. RawSourceWaveStream을 사용하고 MemoryStream을 전달하십시오.

샘플을 부동 소수점으로 직접 제공하고 볼륨을 수정할 수 있으므로 AudioFileReader 클래스가 더 적합 할 수도 있습니다.

관련 문제