FaceAccess/Record/main.cpp

147 lines
4.6 KiB
C++
Raw Normal View History

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>
2024-09-07 15:42:44 +08:00
#ifdef __RV1109__
2024-06-18 14:27:48 +08:00
#include <rkmedia/rkmedia_api.h>
2024-09-07 15:42:44 +08:00
#endif
2024-06-18 14:27:48 +08:00
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-07 15:42:44 +08:00
#ifdef __RV1109__
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);
2024-09-07 15:42:44 +08:00
#endif
2024-09-04 17:57:23 +08:00
} else if (variablesMap.count("record")) {
2024-09-07 15:42:44 +08:00
#ifdef __RV1109__
2024-09-04 17:57:23 +08:00
task = std::make_shared<RecorderTask>();
2024-09-07 15:42:44 +08:00
#endif
2024-09-04 17:57:23 +08:00
} 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-07 15:42:44 +08:00
#ifdef __RV1109__
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-07 15:42:44 +08:00
#endif
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.";
2024-09-07 15:42:44 +08:00
#ifdef __RV1109__
2024-09-04 17:57:23 +08:00
RK_MPI_SYS_Init();
2024-09-07 15:42:44 +08:00
#endif
2024-09-04 17:57:23 +08:00
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
}