我正在捕捉语音聊天程序的音频流(它是专有的,闭源的,我无法控制它),它是用OPUS Codec编码的,我想解码它到原始PCM音频(Opus Decoder doc)。
我正在做的是:
var r = new AuthorRequest
{
Name = "William",
Surname = "Shakespeare",
Books = new BookRequest[] {
new BookRequest { Title = "Macbeth" },
new BookRequest { Title = "Romeo and Juliet" },
},
};
r.Adapt<Author>().Dump();
opusDecoder = opus_decoder_create(48000, 1, &opusResult);
opusResult = opus_decode(opusDecoder, voicePacketBuffer, voicePacketLength, pcm, 9600, 0);
问题出现了:有时它运行得非常好(我可以听到解码的PCM音频没有毛刺和原始速度)但有时,解码后的音频流是在&#34; 慢动作&#34; (有时比正常慢一点,有时慢得多)。
我无法找到原因,因为我不会改变我的程序:解码设置保持不变。然而,有时它有效,有时它不会。此外,pcmFile.write(pcm, opusResult * sizeof(opus_int16));
始终能够解码数据,它不会返回错误代码。
我读到解码器有一个&#34; 状态&#34; (opus_decoder_ctl() doc)。我想也许opus_decode()
次来电之间的时间很重要?
你能想到任何参数,无论是显式的(比如赋予函数的参数)还是隐式的(两次函数调用之间的时间),都可能导致这种影响?
答案 0 :(得分:2)
&#34;慢动作&#34;音频几乎总是不匹配采样率(以高速率录制但以低速率播放)。例如,如果您在48kHz上录制音频,但将其播放为8kHz。
慢动作的另一个可能原因&#34;是由同一解码器解码的多个流。但在这种情况下,你也会得到扭曲的慢音频。
至于OPUS:
因此,一些故障排除建议: