■ Mp3FileReader 클래스를 사용해 모노/스테레오 MP3 파일에서 PCM 데이터를 구하는 방법을 보여준다.
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
using System; using NAudio.Wave; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { using(Mp3FileReader reader = new Mp3FileReader("SOUND\\sample.mp3")) { Console.WriteLine($"샘플 비율 : {reader.WaveFormat.SampleRate}"); Console.WriteLine($"채널 수 : {reader.WaveFormat.Channels}"); Console.WriteLine($"샘플당 비트 수 : {reader.WaveFormat.BitsPerSample}"); Console.WriteLine($"인코딩 : {reader.WaveFormat.Encoding}"); Console.WriteLine($"블럭 정렬 : {reader.WaveFormat.BlockAlign}"); Console.WriteLine($"초당 평균 바이트 수 : {reader.WaveFormat.AverageBytesPerSecond}"); Console.WriteLine($"재생 시간 (단위 : 초) : {reader.Length / reader.WaveFormat.AverageBytesPerSecond}"); if(reader.WaveFormat.Encoding != WaveFormatEncoding.Pcm) { return; } int bufferLength = (int)reader.Length; byte[] buffer = new byte[bufferLength]; if(reader.WaveFormat.Channels == 1) // 모노 채널인 경우 { int readCount = reader.Read(buffer, 0, (int)bufferLength); for(int i = 0; i < readCount; i += 2) { short sample = BitConverter.ToInt16(buffer, i); Console.Write(sample); Console.Write(" "); if(i % 8 == 0) { Console.WriteLine(); } } } else if(reader.WaveFormat.Channels == 2) // 스테레오 채널인 경우 { int readCount = reader.Read(buffer, 0, (int)bufferLength); for(int i = 0; i < readCount; i += 4) { short leftSample = BitConverter.ToInt16(buffer, i ); short rightSample = BitConverter.ToInt16(buffer, i + 2); Console.Write($"{leftSample}, {rightSample}"); Console.Write(" "); if(i % 16 == 0) { Console.WriteLine(); } } } } } #endregion } } |