我正在使用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上收到错误
编码错误参数不正确
答案 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