编码时使用Opus.NET的参数不正确

时间:2017-05-18 16:54:11

标签: c# opus

我正在使用Opus.NET并使用默认采样率48000将默认的演示项目成功编码为音频。当我尝试将采样率更改为8000时,我收到Opus编码错误。

我确信这与segmentFrames加上Bitrate有关,必须相应更改。我无法在此处进行此计算是来自GitHub的默认Opus.NET演示项目的代码。

这是代码

void StartEncoding()
{
    _startTime = DateTime.Now;
    _bytesSent = 0;
    _segmentFrames = 960;
    _encoder = OpusEncoder.Create(48000, 1,   FragLabs.Audio.Codecs.Opus.Application.Voip);
    _encoder.Bitrate = 8192;
    _decoder = OpusDecoder.Create(48000, 1);
    _bytesPerSegment = _encoder.FrameByteCount(_segmentFrames);

    _waveIn = new WaveIn(WaveCallbackInfo.FunctionCallback());
    _waveIn.BufferMilliseconds = 25;
    _waveIn.DeviceNumber = comboBox1.SelectedIndex;
    _waveIn.DataAvailable += _waveIn_DataAvailable;
    _waveIn.WaveFormat = new WaveFormat(48000, 16, 1);

    _playBuffer = new BufferedWaveProvider(new WaveFormat(48000, 16, 1));

    _waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback());
    _waveOut.DeviceNumber = comboBox2.SelectedIndex;
    _waveOut.Init(_playBuffer);

    _waveOut.Play();
    _waveIn.StartRecording();

    if (_timer == null)
    {
        _timer = new System.Windows.Forms.Timer();
        _timer.Interval = 1000;
        _timer.Tick += _timer_Tick;
    }
    _timer.Start();
}

每次我通过将值从48000更改为8000进行编码时,我会在Opus上收到错误

  

编码错误参数不正确

1 个答案:

答案 0 :(得分:2)

您的采样率可以是[8, 12, 16, 24, 48] kHz之一,因此8kHz就可以了。

_segmentFrames的值取决于您的采样率和作品帧的大小(以毫秒为单位)。可能的大小为[2.5, 5, 10, 20, 40, 60] ms,默认值为20ms。所以这是960的计算方式:

SampleRate / 1000 * FrameSize = 48000/1000 * 20 = 960

如果您希望速率为8kHz,则_segmentFrames应该为8000 / 1000 * 20 = 160

_encoder.Bitrate可以是6-510 kbs中的任何一个。

更多信息:https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__encoder.html