无法将 Wav 转换为 Flac,c#,1 错误

Posted

技术标签:

【中文标题】无法将 Wav 转换为 Flac,c#,1 错误【英文标题】:Cannot convert Wav to Flac, c#, 1 Error 【发布时间】:2015-03-02 18:36:33 【问题描述】:

我在我的代码中使用了这个WaveReader class。我收到此错误:

错误:确保样本是整数(例如,不是浮点数)

if (format.wFormatTag != 1) // 1 = PCM 2 = Float
        throw new ApplicationException("Format tag " + format.wFormatTag + " is not supported!");

我正在尝试将 WAV 文件转换为 FLAC,以便将其提供给 GoogleSpeechAPI。我可以做第一步,录制WAV文件。我被困在第二步:将 WAV 文件转换为 FLAC。我可以执行第 3 步:使用 GoogleSpeech API 将 FLAC 转换为文本。

对于我遇到困难的第二步,这是我的代码:

public void WAV_to_FLAC_converter()
    
        string inputFile = "inputFile.wav";
        //string outputFile = Path.Combine("flac", Path.ChangeExtension(input, ".flac"));
        string outputFile = "outputFile.flac";

        if (!File.Exists(inputFile))
            throw new ApplicationException("Input file " + inputFile + " cannot be found!");
        var stream = File.OpenRead(@"C:\inputFile.wav");
        WavReader wav = new WavReader(stream);

        using (var flacStream = File.Create(outputFile))
        
            FlacWriter flac = new FlacWriter(flacStream, wav.BitDepth, wav.Channels, wav.SampleRate);
            // Buffer for 1 second's worth of audio data
            byte[] buffer = new byte[wav.Bitrate / 8];
            int bytesRead;//**I GET THE ABOVE ERROR HERE.**
            do
            
                bytesRead = wav.InputStream.Read(buffer, 0, buffer.Length);
                flac.Write(buffer, 0, bytesRead);
             while (bytesRead > 0);
            flac.Dispose();
            flac = null;
        
    

显然我给函数的输入 wav 文件有问题。我认为它说我创建的流变量是浮点而不是整数。但是我该怎么办?我没有弄乱WAV文件。这只是一个WAV文件。如何将 WAV 文件从浮点数更改为整数?我不知道如何解决这个问题。

【问题讨论】:

【参考方案1】:

我已经使用随机波形文件测试了您的代码,它运行良好。 然后我从here 下载了一个立体声 32 位浮点数据波样本,我得到了和你一样的错误:

错误:确保样本是整数(例如,不是浮点数)

然后我调试了代码并抛出了以下异常

// Ensure that samples are 16 or 24-bit
if (format.wBitsPerSample != 16 && format.wBitsPerSample != 24)
    throw new ApplicationException(format.wBitsPerSample + " bits per sample is not supported by FLAC!");

恐怕 WavReader 类根本不支持 32 位浮点波样本,FlacWriter 也不支持。

更新:我现在让你的项目工作了。您必须在调试文件夹中将 libFlac.dll 重命名为 LibFlac.dll。加载库应该不会再有问题了。我当时得到的是一个 PInvokeStackImabalance 异常。如果你也明白了,你可以按照here 帖子中的说明进行操作,或者在 Debug->Exceptions->Managed Debugging Assistans->PInvokeStackImbalance 下简单地关闭抛出此类异常。

【讨论】:

我将bin/Debug下的DLL文件重命名为LibFlac.dll。我仍然没有处理 DLLNotFoundException。我确保“PInvokeStackImbalance”设置为“抛出”,但我没有得到那个异常 在您的主要方法中实现Console.WriteLine(Environment.CurrentDirectory);... 在此目录中复制dll(并重命名) yupp 那是我添加 LibFlac.dll 的同一个目录。我从网上下载了另一个 LibFlac_dynamic.dll。我在依赖walker中打开了这个新的libFlac_dynamic.dll,它没有错误。但是我之前使用的 LibFlac.dll 在dependancyWalker 中有错误。所以我将 LibFlac_dynamic.dll 重命名为 LibFlac.dll 并将其放在当前目录中并运行。我收到一个新错误:BadImageFormatException 未处理。试图加载格式不正确的程序。 (HRESULT 异常:0x8007000B) 谢谢斯特凡!该错误消失了,我尝试了 32 位版本的 dll 和 64 位版本的 dll。我以前做过,但没有用。因为你告诉我重命名它,它起作用了。奇怪的是,尽管我的笔记本电脑是 64 位的,但 32 位版本而不是 64 位版本可以工作。^_^ 耶。继续新的错误! 天啊!!它已修复!你太棒了,感谢你陪伴我度过这段痛苦的旅程!

以上是关于无法将 Wav 转换为 Flac,c#,1 错误的主要内容,如果未能解决你的问题,请参考以下文章

Macsome iTunes Converter for Mac如何将 Apple Music 转换为 Mac 的 MP3/AAC/WAV/FLAC/AIFF?

音频文件无法读取为 PCM WAV、AIFF/AIFF-C 或 Native FLAC

使用python将任何音频文件转换为mp3

音频文件无法读取为 PCM WAV、AIFF/AIFF-C 或 Native FLAC;检查文件是不是损坏或其他格式

如何使用 javascript 将 wav blob 转换为其他音频类型?

wav格式和pcm格式怎么相互转换?