【问题标题】:Convert audio files to ogg in .net core在 .net core 中将音频文件转换为 ogg
【发布时间】:2019-12-08 20:03:06
【问题描述】:

有没有办法使用 .net core 将任何音频文件转换为 ogg?

我想出了如何将NAudio.Vorbis 从 ogg 转换为 wav:

using (var vorbis = new VorbisWaveReader(inputFile))
{
    WaveFileWriter.CreateWaveFile(outputFile, vorbis);
}

但我找不到将任何音频文件转换为 ogg 的方法。

NAudio 是否提供了我需要的功能,或者还有其他更适合的库吗?

【问题讨论】:

    标签: c# .net-core mp3 wav ogg


    【解决方案1】:

    你可以试试这个库: Vorbis Encoder

    (这个在nuget上,链接的GitHub项目提供了源码和下面的编码示例)

    using System;
    using System.IO;
    
    namespace OggVorbisEncoder.Example
    {
        public class Encoder
        {
            private const int SampleSize = 1024;
    
            [STAThread]
            private static void Main()
            {
                var stdin = new FileStream(@"unencoded.raw", FileMode.Open, FileAccess.Read);
                var stdout = new FileStream(@"encoded.ogg", FileMode.Create, FileAccess.Write);
    
                // StripWavHeader(stdin);
    
                // Stores all the static vorbis bitstream settings
                var info = VorbisInfo.InitVariableBitRate(2, 44100, 0.1f);
    
                // set up our packet->stream encoder
                var serial = new Random().Next();
                var oggStream = new OggStream(serial);
    
                // =========================================================
                // HEADER
                // =========================================================
                // Vorbis streams begin with three headers; the initial header (with
                // most of the codec setup parameters) which is mandated by the Ogg
                // bitstream spec.  The second header holds any comment fields.  The
                // third header holds the bitstream codebook.
                var headerBuilder = new HeaderPacketBuilder();
    
                var comments = new Comments();
                comments.AddTag("ARTIST", "TEST");
    
                var infoPacket = headerBuilder.BuildInfoPacket(info);
                var commentsPacket = headerBuilder.BuildCommentsPacket(comments);
                var booksPacket = headerBuilder.BuildBooksPacket(info);
    
                oggStream.PacketIn(infoPacket);
                oggStream.PacketIn(commentsPacket);
                oggStream.PacketIn(booksPacket);
    
                // Flush to force audio data onto its own page per the spec
                OggPage page;
                while (oggStream.PageOut(out page, true))
                {
                    stdout.Write(page.Header, 0, page.Header.Length);
                    stdout.Write(page.Body, 0, page.Body.Length);
                }
    
                // =========================================================
                // BODY (Audio Data)
                // =========================================================
                var processingState = ProcessingState.Create(info);
    
                var buffer = new float[info.Channels][];
                buffer[0] = new float[SampleSize];
                buffer[1] = new float[SampleSize];
    
                var readbuffer = new byte[SampleSize*4];
                while (!oggStream.Finished)
                {
                    var bytes = stdin.Read(readbuffer, 0, readbuffer.Length);
    
                    if (bytes == 0)
                    {
                        processingState.WriteEndOfStream();
                    }
                    else
                    {
                        var samples = bytes/4;
    
                        for (var i = 0; i < samples; i++)
                        {
                            // uninterleave samples
                            buffer[0][i] = (short) ((readbuffer[i*4 + 1] << 8) | (0x00ff & readbuffer[i*4]))/32768f;
                            buffer[1][i] = (short) ((readbuffer[i*4 + 3] << 8) | (0x00ff & readbuffer[i*4 + 2]))/32768f;
                        }
    
                        processingState.WriteData(buffer, samples);
                    }
    
                    OggPacket packet;
                    while (!oggStream.Finished
                           && processingState.PacketOut(out packet))
                    {
                        oggStream.PacketIn(packet);
    
                        while (!oggStream.Finished
                               && oggStream.PageOut(out page, false))
                        {
                            stdout.Write(page.Header, 0, page.Header.Length);
                            stdout.Write(page.Body, 0, page.Body.Length);
                        }
                    }
                }
    
                stdin.Close();
                stdout.Close();
            }
    
            /// <summary>
            ///     We cheat on the WAV header; we just bypass the header and never
            ///     verify that it matches 16bit/stereo/44.1kHz.This is just an
            ///     example, after all.
            /// </summary>
            private static void StripWavHeader(BinaryReader stdin)
            {
                var tempBuffer = new byte[6];
                for (var i = 0; (i < 30) && (stdin.Read(tempBuffer, 0, 2) > 0); i++)
                    if ((tempBuffer[0] == 'd') && (tempBuffer[1] == 'a'))
                    {
                        stdin.Read(tempBuffer, 0, 6);
                        break;
                    }
            }
        }
    }
    

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 感谢您的回答。我试过了,但转换后的文件包含很多噪音,几乎无法理解。难道我做错了什么?我试图从 wav 和 mp3 转换为 ogg。
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2018-12-19
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2013-07-12
    相关资源
    最近更新 更多