NAudioを使用して変換されたMP3ファイルからサンプルを直接読み取る

StackOverflow https://stackoverflow.com/questions/1804489

  •  05-07-2019
  •  | 
  •  

質問

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

ここで何が起こっているのですか?どちらのストリームも同じWave形式なので、同じAPIを使用してサンプルを読み取ることができると期待しています。 Position プロパティを設定しても効果はありません。

役に立ちましたか?

解決

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

WAVファイルは、それらから単一のサンプルを読みやすく、読みやすいため、別の問題です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top