2009-11-26 4 views
0

NAudio를 사용하여 (변환 된) MP3 파일에서 PCM 샘플을 읽으려고하지만 Read 메서드가 실패 할 때마다 매번 EOF를 나타내는 0을 반환합니다.변환 된 MP3 파일에서 직접 NAudio를 사용하여 읽음

예 : 단일 16 비트 샘플을 읽으려고 코드의이 조각은 항상 "0"를 출력 :

using System; 
using NAudio.Wave; 

namespace NAudioMp3Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (Mp3FileReader fr = new Mp3FileReader("MySong.mp3")) 
      { 
       byte[] buffer = new byte[2]; 
       using (WaveStream pcm = WaveFormatConversionStream.CreatePcmStream(fr)) 
       { 
        using (WaveStream aligned = new BlockAlignReductionStream(pcm)) 
        { 
         Console.WriteLine(aligned.WaveFormat); 
         Console.WriteLine(aligned.Read(buffer, 0, 2)); 
        } 
       } 
      } 
     } 
    } 
} 

출력 :

16 bit PCM: 44kHz 2 channels 
0 

그러나 읽 버전 WAV 파일은 잘 작동합니다 (유사한 샘플을 포함하도록 MP3를 WAV로 변환하기 위해 iTunes를 사용했습니다).

static void Main(string[] args) 
{ 
    using (WaveFileReader pcm = new WaveFileReader("MySong.wav")) 
    { 
     byte[] buffer = new byte[2]; 
     using (WaveStream aligned = new BlockAlignReductionStream(pcm)) 
     { 
      Console.WriteLine(aligned.WaveFormat); 
      Console.WriteLine(aligned.Read(buffer, 0, 2)); 
     } 
    } 
} 

출력 :

16 bit PCM: 44kHz 2 channels 
2 

여기에 무슨 일이 일어나고 있습니까? 두 스트림 모두 동일한 웨이브 형식을 가지고 있으므로 동일한 API를 사용하여 샘플을 읽을 수있을 것으로 기대합니다. Position 속성을 설정해도 도움이되지 않습니다.

답변

1

큰 덩어리로 읽어야 할 수도 있습니다. NAudio는 ACM을 사용하여 MP3에서 WAV 로의 변환을 수행하며, 대상 버퍼가 충분히 크지 않으면 코덱에서 데이터를 전혀 변환하지 않을 수 있습니다. 즉, 첫 번째 샘플을 읽기 전에 샘플 블록을 변환해야합니다.

WAV 파일은 단일 샘플을 읽기 쉽고 멋지 기 때문에 다른 문제입니다.

+0

나는'BlockAlignReductionStream'이 그렇게 할 것이라고 생각했다. 어쩌면 큰 버퍼를 할당하도록 매개 변수를 전달해야 할 필요가 있습니까? – finnw

+0

예, 일부 경우에는 블록 정렬 축소 스트림이 도움이되지만 Read 메소드에서 계산하는 sourceReadCount가 0 또는 너무 낮을 수 있습니다. sourceReadCount를 계산할 때 디버깅 할 수 있다면 흥미로울 것입니다. 아마도 나는 수정을 할 수있다. –

관련 문제