Add opus codec test

This commit is contained in:
dijunkun
2023-11-21 22:30:25 -08:00
parent 19506af831
commit e44c5b1cc7
12 changed files with 368 additions and 2 deletions

96
tests/opus/opus_test.cpp Normal file
View File

@@ -0,0 +1,96 @@
#include <fstream>
#include <iostream>
#include <vector>
// Opus<75><73><EFBFBD><EFBFBD><EBBAAF>
#include <opus/opus.h>
#include <iostream>
#include <vector>
#define SAMPLE_RATE 48000
#define CHANNELS 2
#define FRAME_SIZE 960
#define APPLICATION OPUS_APPLICATION_AUDIO
// <20><><EFBFBD><EFBFBD><EBBAAF>
int encode(const std::vector<opus_int16>& pcm,
std::vector<unsigned char>& opus) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int error;
OpusEncoder* encoder =
opus_encoder_create(SAMPLE_RATE, CHANNELS, APPLICATION, &error);
if (error != OPUS_OK) {
std::cerr << "Failed to create encoder: " << opus_strerror(error)
<< std::endl;
return error;
}
// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
opus_encoder_ctl(encoder, OPUS_SET_BITRATE(64000));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
int maxOpusSize = FRAME_SIZE * CHANNELS * sizeof(opus_int16);
opus.resize(maxOpusSize);
// <20><><EFBFBD><EFBFBD>
int encodedSize =
opus_encode(encoder, pcm.data(), FRAME_SIZE, opus.data(), maxOpusSize);
if (encodedSize < 0) {
std::cerr << "Encoding error: " << opus_strerror(encodedSize) << std::endl;
return encodedSize;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
opus_encoder_destroy(encoder);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
opus.resize(encodedSize);
return 0;
}
int main(int argc, char** argv) {
if (argc != 3) {
std::cerr << "Usage: " << argv[0] << " input.pcm output.opus" << std::endl;
return -1;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
std::ifstream inputFile(argv[1], std::ios::binary);
if (!inputFile) {
std::cerr << "Failed to open input file." << std::endl;
return -1;
}
// <20><>ȡPCM<43><4D><EFBFBD><EFBFBD>
std::vector<opus_int16> pcmData;
opus_int16 sample;
while (inputFile.read(reinterpret_cast<char*>(&sample), sizeof(opus_int16))) {
pcmData.push_back(sample);
}
// <20><><EFBFBD><EFBFBD>ΪOpus<75><73>ʽ
std::vector<unsigned char> opusData;
int result = encode(pcmData, opusData);
if (result != 0) {
std::cerr << "Encoding failed with error code " << result << std::endl;
return result;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
std::ofstream outputFile(argv[2], std::ios::binary);
if (!outputFile) {
std::cerr << "Failed to open output file." << std::endl;
return -1;
}
// д<><D0B4>Opus<75><73><EFBFBD><EFBFBD>
outputFile.write(reinterpret_cast<const char*>(opusData.data()),
opusData.size());
// <20><><EFBFBD><EFBFBD>
std::cout << "Encoding complete. size:" << pcmData.size() * 2 << std::endl;
return 0;
}