0

NAudioを使用して(変換された)MP3ファイルからPCMサンプルを読み取ろうとしていますが、Readメソッドが毎回ゼロ(EOFを示す)を返すため失敗します。

例:単一の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ファイルから読み取るこのバージョンは正常に機能します(iTunesを使用してMP3をWAVに変換したので、同様のサンプルが含まれているはずです)。

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しても役に立ちません。

4

1 に答える 1

1

おそらく、より大きなチャンクで読み取る必要があります。NAudioはACMを使用してMP3からWAVへの変換を実行します。ターゲットバッファが十分に大きくない場合、コーデックはデータの変換をまったく拒否する可能性があります。つまり、最初のサンプルを読み取る前に、サンプルのブロックを変換する必要があります。

WAVファイルは、それらから1つのサンプルを読み取るのが便利で簡単なため、別の問題です。

于 2009-11-27T06:46:44.093 に答える