c#-BASS.Net立即创建一个频谱图(不播放音乐文件)

c#-BASS.Net立即创建一个频谱图(不播放音乐文件),c#,audio,spectrum,spectrogram,bass,C#,Audio,Spectrum,Spectrogram,Bass,我发现的这段代码创建了一个给定文件的光谱图,但它让我在播放和绘制光谱图时等待 我需要修改这段代码,立即创建光谱图,而无需播放文件 提前谢谢 public partial class Form1 : Form { private int _handle; private int _pos; private BASSTimer _timer; private Visuals _visuals; public Form1() { Ini

我发现的这段代码创建了一个给定文件的光谱图,但它让我在播放和绘制光谱图时等待

我需要修改这段代码,立即创建光谱图,而无需播放文件

提前谢谢

public partial class Form1 : Form
{
    private int _handle;
    private int _pos;
    private BASSTimer _timer;
    private Visuals _visuals;

    public Form1()
    {
        InitializeComponent();
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        bool spectrum3DVoicePrint = _visuals.CreateSpectrum3DVoicePrint(_handle, pictureBox1.CreateGraphics(),
                                                                        pictureBox1.Bounds, Color.Cyan, Color.Green,
                                                                        _pos, false, true);
        _pos++;
        if (_pos >= pictureBox1.Width)
        {
            _pos = 0;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        string file = "..\\..\\mysong.mp3";
        if (Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, Handle))
        {
            _handle = Bass.BASS_StreamCreateFile(file, 0, 0, BASSFlag.BASS_DEFAULT);

            if (Bass.BASS_ChannelPlay(_handle, false))
            {
                _visuals = new Visuals();
                _timer = new BASSTimer((int) (1.0d/10*1000));
                _timer.Tick += timer_Tick;
                _timer.Start();
            }
        }
    }
}

下面是我解决问题的方法。 这个想法是,你不应该听整个记录,你可以移动音频光标,并在某些点评估频谱

    private Bitmap DrawSpectrogram(string fileName, int height, int stepsPerSecond)
    {
        Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, Handle);
        int channel = Bass.BASS_StreamCreateFile(fileName, 0, 0, BASSFlag.BASS_DEFAULT);

        long len = Bass.BASS_ChannelGetLength(channel, BASSMode.BASS_POS_BYTES); // the length in bytes
        double time = Bass.BASS_ChannelBytes2Seconds(channel, len); // the length in seconds

        int steps = (int)Math.Floor(stepsPerSecond * time);

        Bitmap result = new Bitmap(steps, height);
        Graphics g = Graphics.FromImage(result);

        Visuals visuals = new Visuals();


        Bass.BASS_ChannelPlay(channel, false);

        for (int i = 0; i < steps; i++)
        {
            Bass.BASS_ChannelSetPosition(channel, 1.0 * i / stepsPerSecond);
            visuals.CreateSpectrum3DVoicePrint(channel, g, new Rectangle(0, 0, result.Width, result.Height), Color.Black, Color.White, i, true, false);
        }

        Bass.BASS_ChannelStop(channel);

        Bass.BASS_Stop();
        Bass.BASS_Free();

        return result;
    }
私有位图绘图谱图(字符串文件名、int高度、int步长秒)
{
Bass.Bass_Init(-144100,BASSInit.Bass_设备默认值,句柄);
int channel=Bass.Bass\u StreamCreateFile(文件名,0,0,BASSFlag.Bass\u默认值);
long len=Bass.Bass_ChannelGetLength(channel,BASSMode.Bass_POS_BYTES);//长度以字节为单位
双音时间=低音。低音_channelbytes2秒(声道,len);//以秒为单位的长度
int steps=(int)Math.Floor(stepsPerSecond*时间);
位图结果=新位图(步长、高度);
Graphics g=Graphics.FromImage(结果);
视觉效果=新的视觉效果();
Bass.Bass_ChannelPlay(频道,假);
对于(int i=0;i