2024-09-04 17:57:23 +08:00
|
|
|
#include "main.h"
|
|
|
|
#include "BoostLog.h"
|
2024-06-18 14:27:48 +08:00
|
|
|
#include "FFmpegResample.h"
|
2024-09-04 17:57:23 +08:00
|
|
|
#include "IoContext.h"
|
|
|
|
#include "WebRTCPublisher.h"
|
|
|
|
#include <boost/asio/signal_set.hpp>
|
|
|
|
#include <boost/program_options/options_description.hpp>
|
|
|
|
#include <boost/program_options/parsers.hpp>
|
|
|
|
#include <boost/program_options/variables_map.hpp>
|
|
|
|
#include <com/amazonaws/kinesis/video/webrtcclient/Include.h>
|
2024-09-06 16:35:51 +08:00
|
|
|
#include <filesystem>
|
2024-06-18 14:27:48 +08:00
|
|
|
#include <fstream>
|
|
|
|
#include <rkmedia/rkmedia_api.h>
|
|
|
|
|
2024-09-04 17:57:23 +08:00
|
|
|
void signal_handler(const boost::system::error_code &error, int signal_number) {
|
|
|
|
if (!error) {
|
|
|
|
LOG(info) << "Caught signal: " << signal_number << std::endl;
|
|
|
|
|
|
|
|
LOG(info) << "task finished.";
|
|
|
|
std::exit(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-06-18 14:27:48 +08:00
|
|
|
int main(int argc, char **argv) {
|
2024-09-04 17:57:23 +08:00
|
|
|
using namespace Amass;
|
|
|
|
using namespace std::placeholders;
|
|
|
|
boost::program_options::options_description optionsDescription("Allowed options");
|
|
|
|
// clang-format off
|
|
|
|
optionsDescription.add_options()
|
|
|
|
("help,h", "produce help message")
|
|
|
|
("echo", "Self-recording and self-play test")
|
|
|
|
("record", "Record to file.")
|
|
|
|
("play", "Play pcm file.")
|
2024-09-06 16:35:51 +08:00
|
|
|
("file", "process file.")
|
|
|
|
("dsp", boost::program_options::value<std::string>()->default_value("aecm"), "vqe, speex, aecm")
|
2024-09-04 17:57:23 +08:00
|
|
|
("channels", boost::program_options::value<int>(), "set audio channles")
|
|
|
|
("path", boost::program_options::value<std::string>(), "file path")
|
2024-09-06 16:35:51 +08:00
|
|
|
("dump,d", boost::program_options::value<bool>()->default_value(false), "dump file.")
|
2024-09-04 17:57:23 +08:00
|
|
|
;
|
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
boost::program_options::variables_map variablesMap;
|
|
|
|
boost::program_options::store(boost::program_options::parse_command_line(argc, argv, optionsDescription), variablesMap);
|
|
|
|
boost::program_options::notify(variablesMap);
|
|
|
|
|
|
|
|
if (variablesMap.count("help")) {
|
|
|
|
std::cout << optionsDescription << std::endl;
|
|
|
|
return 1;
|
2024-06-18 14:27:48 +08:00
|
|
|
}
|
|
|
|
|
2024-09-04 17:57:23 +08:00
|
|
|
std::shared_ptr<Task> task;
|
|
|
|
if (variablesMap.count("echo")) {
|
|
|
|
int channels = 2;
|
|
|
|
if (variablesMap.count("channels")) {
|
|
|
|
channels = variablesMap["channels"].as<int>();
|
2024-06-18 14:27:48 +08:00
|
|
|
}
|
2024-09-04 17:57:23 +08:00
|
|
|
|
|
|
|
auto t = std::make_shared<EchoRecordTask>();
|
2024-09-06 16:35:51 +08:00
|
|
|
t->setDsp(dspFromString(variablesMap["dsp"].as<std::string>()));
|
2024-09-04 17:57:23 +08:00
|
|
|
t->setChannels(channels);
|
2024-09-06 16:35:51 +08:00
|
|
|
t->setDumpEnabled(variablesMap["dump"].as<bool>());
|
2024-09-04 17:57:23 +08:00
|
|
|
task = std::dynamic_pointer_cast<Task>(t);
|
|
|
|
} else if (variablesMap.count("record")) {
|
|
|
|
task = std::make_shared<RecorderTask>();
|
|
|
|
} else if (variablesMap.count("play")) {
|
|
|
|
std::string path;
|
|
|
|
if (variablesMap.count("path")) {
|
|
|
|
path = variablesMap["path"].as<std::string>();
|
|
|
|
}
|
2024-09-04 20:17:15 +08:00
|
|
|
|
|
|
|
int channels = 2;
|
|
|
|
if (variablesMap.count("channels")) {
|
|
|
|
channels = variablesMap["channels"].as<int>();
|
|
|
|
}
|
|
|
|
|
2024-09-04 17:57:23 +08:00
|
|
|
auto t = std::make_shared<PlayerTask>();
|
2024-09-04 20:17:15 +08:00
|
|
|
t->setChannels(channels);
|
2024-09-04 17:57:23 +08:00
|
|
|
t->setPath(path);
|
|
|
|
task = std::dynamic_pointer_cast<Task>(t);
|
2024-09-06 16:35:51 +08:00
|
|
|
} else if (variablesMap.count("file")) {
|
|
|
|
auto t = std::make_shared<ProcessFileTask>();
|
|
|
|
t->setDsp(dspFromString(variablesMap["dsp"].as<std::string>()));
|
|
|
|
task = std::dynamic_pointer_cast<Task>(t);
|
2024-09-04 17:57:23 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!task) {
|
|
|
|
std::cout << "there is not task." << std::endl << std::endl;
|
|
|
|
std::cout << optionsDescription << std::endl;
|
|
|
|
return 2;
|
|
|
|
}
|
2024-09-06 16:35:51 +08:00
|
|
|
if (!std::filesystem::exists(DumpPath)) {
|
|
|
|
std::filesystem::create_directory(DumpPath);
|
|
|
|
}
|
2024-09-04 17:57:23 +08:00
|
|
|
|
|
|
|
try {
|
|
|
|
LOG(info) << "app start.";
|
|
|
|
RK_MPI_SYS_Init();
|
|
|
|
initKvsWebRtc();
|
|
|
|
auto ioConext = Singleton<IoContext>::instance<Construct>();
|
|
|
|
boost::asio::signal_set signals(*ioConext->ioContext(), SIGINT, SIGTERM);
|
|
|
|
signals.async_wait(std::bind(&signal_handler, _1, _2));
|
|
|
|
|
|
|
|
task->run();
|
|
|
|
|
|
|
|
ioConext->run<IoContext::Mode::Synchronous>();
|
|
|
|
} catch (std::exception &e) {
|
|
|
|
LOG(error) << "Exception: " << e.what() << std::endl;
|
2024-06-18 14:27:48 +08:00
|
|
|
}
|
|
|
|
|
2024-09-04 17:57:23 +08:00
|
|
|
// WebRTCPublisher publisher(true, true);
|
|
|
|
// publisher.start("172.16.103.68", "443", "/index/api/webrtc?app=live&stream=test&type=push");
|
2024-06-18 14:27:48 +08:00
|
|
|
return 0;
|
2024-09-06 09:45:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
Dsp dspFromString(const std::string &dsp) {
|
|
|
|
Dsp ret = Vqe;
|
|
|
|
if (dsp == "speex") {
|
|
|
|
ret = Speex;
|
|
|
|
} else if (dsp == "aecm") {
|
|
|
|
ret = AecMobile;
|
2024-09-06 16:35:51 +08:00
|
|
|
} else if (dsp == "aec3") {
|
2024-09-06 09:45:44 +08:00
|
|
|
ret = Aec3;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string dspToString(Dsp dsp) {
|
|
|
|
std::string ret = "none";
|
|
|
|
if (dsp == Vqe) {
|
|
|
|
ret = "vqe";
|
|
|
|
} else if (dsp == Speex) {
|
|
|
|
ret = "speex";
|
|
|
|
} else if (dsp == AecMobile) {
|
|
|
|
ret = "aecm";
|
|
|
|
} else if (dsp == Aec3) {
|
|
|
|
ret = "aec3";
|
|
|
|
}
|
|
|
|
return ret;
|
2024-06-18 14:27:48 +08:00
|
|
|
}
|