我需要通过网络传输声音,为此,我选择了“ PortAudio”和“ Opus”库。我是声音处理的新手,因此我不了解很多。我不熟悉声音的工作,因此我不了解很多,但是我阅读了文档并看了一些示例,但是我仍然有一些示例Opus编码/解码问题。我不了解如何正确还原原始编码的PСM。我有一些操作顺序: 一些常量
Task task = new Task(() => controller.Play());
task.Start();
我收到const int FRAMES_PER_BUFFER = 960;
const int SAMPLE_RATE = 48000;
int NUM_CHANNELS = 2;
int totalFrames = 2 * SAMPLE_RATE; /* Record for a few seconds. */
int numSamples = totalFrames * 2;
int numBytes = numSamples * sizeof(float);
float *sampleBlock = nullptr;
int bytesOfPacket = 0;
unsigned char *packet = nullptr;
的PСM
sampleBlock
编码paError = Pa_ReadStream(**&stream, sampleBlock, totalFrames);
if (paError != paNoError) {
cout << "PortAudio error : " << Pa_GetErrorText(paError) << endl;
std::system("pause");
}
sampleBlock
好的,我收到了对Opus的编码的OpusEncoder *encoder;
int error;
int size;
encoder = opus_encoder_create(SAMPLE_RATE, NUM_CHANNELS, OPUS_APPLICATION_VOIP, &error);
size = opus_encoder_get_size(NUM_CHANNELS);
encoder = (OpusEncoder *)malloc(size);
packet = new unsigned char[480];
error = opus_encoder_init(encoder, SAMPLE_RATE, NUM_CHANNELS, OPUS_APPLICATION_VOIP);
if (error == -1) {
return -1;
}
bytesOfPacket = opus_encode_float(encoder, sampleBlock, FRAMES_PER_BUFFER, packet, 480);
opus_encoder_destroy(encoder);
解码
packet
在这里,我试图将Opus解码回PCM,并将结果保存到OpusDecoder *decoder;
int error;
int size;
decoder = opus_decoder_create(SAMPLE_RATE, NUM_CHANNELS, &error);
size = opus_decoder_get_size(NUM_CHANNELS);
decoder = (OpusDecoder *)malloc(size);
error = opus_decoder_init(decoder, SAMPLE_RATE, NUM_CHANNELS);
opus_decode_float(decoder, packet, bytesOfPacket, sampleBlock, 480, 0);
opus_decoder_destroy(decoder);
播放声音
sampleBlock
我变得沉默。由于我是这个行业的新手,所以我不太了解音效的细微之处。帮助请理解出什么问题。
答案 0 :(得分:0)
关于您的设置,每个opus_encode_float呼叫要编码20毫秒的音频。我看不到此呼叫的任何迭代,因此我想您没有听到任何声音,因为您仅编码了20ms的音频。您应该传递给opus_encode_float 20ms的样本,并使用sampleBlock指针将其在整个缓冲区中递增x倍。
尝试编码更多音频,并记住您必须添加某种帧以对其进行解码。您不能只将整个缓冲区提供给解码器。您应该为每个编码器调用一次向解码器提供与每个编码器调用输出的数据相同的数据。
达米亚诺