Naudio를 사용하여 변환 된 MP3 파일에서 직접 샘플을 읽습니다.

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

  •  05-07-2019
  •  | 
  •  

문제

Naudio를 사용하여 (변환 된) MP3 파일에서 PCM 샘플을 읽으려고하지만 Read 메소드는 매번 0을 반환합니다 (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 속성도 도움이되지 않습니다.

도움이 되었습니까?

해결책

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

WAV 파일은 하나의 샘플을 읽기 쉽고 쉽게 읽을 수 있기 때문에 다른 문제입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top