제품 개요
하위 제품 소개
기본 개념
제품 기능
응용 시나리오
제품 장점
사용 제한
기능 모드 | 설명 |
방송 모드 | 이 모드에서는 데이터 무결성과 연결 안정성을 보장하는 중복 데이터를 전송하도록 여러 링크를 구성할 수 있습니다. |
프라이머리/세컨더리 모드 | 이 모드에서는 연결 안정성과 신뢰도에 따라 한 번에 하나의 링크만 활성화되며 실시간으로 최적의 연결을 선택하여 데이터를 전송합니다. 이는 연결 안정성과 신뢰성을 보장할 뿐만 아니라 중복 데이터의 대역폭 사용을 줄입니다. |
취합 모드 | 높은 비트 레이트와 대역폭이 필요한 시나리오에서 단일 연결의 대역폭이 요구 사항을 충족할 수 없는 경우 이 모드는 데이터를 분할하고 여러 연결을 통해 데이터를 보낸 다음 수신기 끝에서 데이터를 재결합하여 사용 가능한 대역폭을 늘릴 수 있습니다. |

std::unique_ptr<tmio::TmioProxy> proxy_ = tmio::TmioProxy::createUnique();
void setListener(TmioProxyListener *listener);
tmio-preset.h에서 제공하는 보조 방법을 사용할 수 있습니다./*void onTmioConfig(Tmio *tmio);*/void onTmioConfig(tmio::Tmio *tmio) override {auto protocol = tmio->getProtocol();if (protocol == tmio::Protocol::SRT) {tmio::SrtPreset::rtmp(tmio);} else if (protocol == tmio::Protocol::RIST) {tmio->setIntOption(tmio::base_options::RECV_SEND_FLAGS,tmio::base_options::FLAG_SEND);}}
/*void onStart(const char *local_addr, uint16_t local_port);*/void onStart(const char *addr, uint16_t port) override {LOGFI("ip %s, port %" PRIu16, addr, port);}
/*void onError(ErrorType type, const std::error_code &err);*/void onError(tmio::TmioProxyListener::ErrorType type,const std::error_code &err) override {LOGFE("error type %s, %s, %d", tmio::TmioProxyListener::errorType(type),err.message().c_str(), err.value());}
std::error_code start(const std::string &local_url, const std::string &remote_url, void * config=nullptr)
매개변수 | 비고 |
local_url | TCP Scheme만 지원합니다. 형식은 tcp://${ip}:${port}입니다. port는 0일 수 있으며 이는 임의의 포트를 바인딩함을 나타냅니다. 바인딩이 성공하면 onStart() 콜백을 통해 바인딩된 포트가 애플리케이션으로 반환됩니다. 포트 0을 사용하면 포트 점유 및 권한 없음과 같은 문제로 인한 바인딩 실패를 방지할 수 있습니다. |
remote_url | 원격 서버 URL |
config | SRT bonding 기능 및 QUIC H3 프로토콜이 활성화된 경우에만 적용되는 구성 매개변수입니다. 구체적인 정의는 tmio.h의 TmioFeatureConfig 구조 정의를 참고하십시오. |
proxy_->start(local_url, remote_url, NULL);
tmio::TmioFeatureConfig option;option_.protocol = tmio::Protocol::SRT;option_.trans_mode = static_cast<int>(tmio::SrtTransMode::SRT_TRANS_BACKUP);/*-----------------------------------------------------------*/{//필요에 따라 여러 연결을 추가할 수 있습니다option_.addAvailableNet(net_name, local_addr, remote_url, 0, weight, -1);}/*-----------------------------------------------------------*/proxy_->start(local_url, remote_url, &option_);
/*void stop();*/proxy_.stop();

tmio_ = tmio::TmioFactory::createUnique(tmio::Protocol::SRT);tmio::SrtPreset::mpegTsLossless(tmio_.get());tmio_->setIntOption(tmio::srt_options::CONNECT_TIMEOUT, 4000);tmio_->setBoolOption(tmio::base_options::THREAD_SAFE_CHECK, true);
TmioFactory를 사용하여 생성할 수 있습니다.tmio-option.h를 참고하십시오.tmio-preset.h를 참고하십시//다양한 매개변수 속성을 기반으로 적절한 구성 선택bool setBoolOption(const std::string &optname, bool value);bool setIntOption(const std::string &optname, int64_t value);bool setDoubleOption(const std::string &optname, double value);bool setStrOption(const std::string &optname, const std::string &value);...
/*** open the stream specified by url** @param config protocol dependent*/virtual std::error_code open(const std::string &url,void *config = nullptr) = 0;
//기본적으로 단일 링크auto err = tmio->open(TMIO_SRT_URL);if (err) {LOGE("open failed, %d, %s", err.value(), err.message().c_str());}
tmio.h 파일의 TmioFeatureConfig 구조 정의를 참고하십시오.tmio::TmioFeatureConfig option_;option_.protocol = tmio::Protocol::SRT;option_.trans_mode = static_cast<int>(tmio::SrtTransMode::SRT_TRANS_BACKUP);option_.addAvailableNet(net_name, local_addr, remote_url, 0, weight, -1);
//다중 연결 bondingauto err = tmio_->open(TMIO_SRT_URL, &option_);if (err) {LOGE("open failed, %d, %s", err.value(), err.message().c_str());}
int ret = tmio_->send(buf.data(), datalen, err);if (ret < 0) {LOGE("send failed, %d, %s", err.value(), err.message().c_str());break;}
/*** receive data** @param err return error details* @return number of bytes which were received, or < 0 to indicate error*/virtual int recv(uint8_t *buf, int len, std::error_code &err) = 0;using RecvCallback = std::function<bool(const uint8_t *buf, int len, const std::error_code &err)>;/*** receive data in event loop** recvLoop() block current thread, receive data in a loop and pass the data to recvCallback* @param recvCallback return true to continue the receive loop, false for break*/virtual void recvLoop(const RecvCallback &recvCallback) = 0;
while (true) {ret = tmio_->recv(buf.data(), buf.size(), err);if (ret < 0) {LOGE("recv error: %d, %s", err.value(), err.message().c_str());break;}...}
FILE *file = fopen(output_path, "w");tmio_->recvLoop([file](const uint8_t *buf, int len,const std::error_code &err) {if (len < 0) {fwrite(buf, 1, len, file);} else if (len < 0) {LOGE("recv error: %d, %s", err.value(), err.message().c_str());}return true;});
tmio_->close();
tmio::PerfStats stats_;tmio_->control(tmio::ControlCmd::GET_STATS, &stats_);
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkRequest request = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR).addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback(){@Overridepublic void onAvailable(@NonNull Network network) {Log.d(TAG, "모바일 데이터 네트워크 채널이 활성화되었습니다.");super.onAvailable(network);}}
피드백