mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 12:45:35 +08:00
Add opus codec test
This commit is contained in:
96
tests/opus/opus_test.cpp
Normal file
96
tests/opus/opus_test.cpp
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user