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
속성을 설정해도 도움이되지 않습니다.
나는'BlockAlignReductionStream'이 그렇게 할 것이라고 생각했다. 어쩌면 큰 버퍼를 할당하도록 매개 변수를 전달해야 할 필요가 있습니까? – finnw
예, 일부 경우에는 블록 정렬 축소 스트림이 도움이되지만 Read 메소드에서 계산하는 sourceReadCount가 0 또는 너무 낮을 수 있습니다. sourceReadCount를 계산할 때 디버깅 할 수 있다면 흥미로울 것입니다. 아마도 나는 수정을 할 수있다. –