[*] 才子词人 自是白衣卿相
This commit is contained in:
@@ -21,20 +21,20 @@ namespace acgist {
|
||||
jclass jCallbackClazz = this->env->GetObjectClass(this->routerCallback);
|
||||
jmethodID sendTransportConnectCallback = this->env->GetMethodID(jCallbackClazz, "sendTransportConnectCallback", "(Ljava/lang/String;Ljava/lang/String;)V");
|
||||
const char *cTransportId = transport->GetId().data();
|
||||
jstring jTransportId = env->NewStringUTF(cTransportId);
|
||||
jstring jTransportId = this->env->NewStringUTF(cTransportId);
|
||||
const char *cDtlsParameters = dtlsParameters.dump().data();
|
||||
jstring jDtlsParameters = env->NewStringUTF(cDtlsParameters);
|
||||
jstring jDtlsParameters = this->env->NewStringUTF(cDtlsParameters);
|
||||
this->env->CallVoidMethod(
|
||||
this->routerCallback,
|
||||
sendTransportConnectCallback,
|
||||
jTransportId,
|
||||
jDtlsParameters
|
||||
);
|
||||
env->DeleteLocalRef(jTransportId);
|
||||
env->ReleaseStringUTFChars(jTransportId, cTransportId);
|
||||
env->DeleteLocalRef(jDtlsParameters);
|
||||
env->ReleaseStringUTFChars(jDtlsParameters, cDtlsParameters);
|
||||
env->DeleteLocalRef(jCallbackClazz);
|
||||
this->env->DeleteLocalRef(jTransportId);
|
||||
this->env->ReleaseStringUTFChars(jTransportId, cTransportId);
|
||||
this->env->DeleteLocalRef(jDtlsParameters);
|
||||
this->env->ReleaseStringUTFChars(jDtlsParameters, cDtlsParameters);
|
||||
this->env->DeleteLocalRef(jCallbackClazz);
|
||||
return std::future<void>();
|
||||
}
|
||||
|
||||
@@ -46,11 +46,12 @@ namespace acgist {
|
||||
jclass jCallbackClazz = this->env->GetObjectClass(this->routerCallback);
|
||||
jmethodID sendTransportProduceCallback = this->env->GetMethodID(jCallbackClazz, "sendTransportProduceCallback", "(Ljava/lang/String;Ljava/lang/String;)V");
|
||||
const char *cKind = kind.data();
|
||||
jstring jKind = env->NewStringUTF(cKind);
|
||||
jstring jKind = this-> env->NewStringUTF(cKind);
|
||||
const char *cTransportId = transport->GetId().data();
|
||||
jstring jTransportId = env->NewStringUTF(cTransportId);
|
||||
jstring jTransportId = this-> env->NewStringUTF(cTransportId);
|
||||
const char *cRtpParameters = rtpParameters.dump().data();
|
||||
jstring jRtpParameters = env->NewStringUTF(cRtpParameters);
|
||||
jstring jRtpParameters = this-> env->NewStringUTF(cRtpParameters);
|
||||
std::promise<std::string> promise;
|
||||
jstring jResult = (jstring) this->env->CallObjectMethod(
|
||||
this->routerCallback,
|
||||
sendTransportProduceCallback,
|
||||
@@ -58,19 +59,20 @@ namespace acgist {
|
||||
jTransportId,
|
||||
jRtpParameters
|
||||
);
|
||||
const char *cResult = env->GetStringUTFChars(jResult, 0);
|
||||
const char *cResult = this-> env->GetStringUTFChars(jResult, 0);
|
||||
std::string result(cResult);
|
||||
env->DeleteLocalRef(jResult);
|
||||
env->DeleteLocalRef(jKind);
|
||||
env->ReleaseStringUTFChars(jKind, cKind);
|
||||
env->DeleteLocalRef(jResult);
|
||||
env->ReleaseStringUTFChars(jResult, cResult);
|
||||
env->DeleteLocalRef(jTransportId);
|
||||
env->ReleaseStringUTFChars(jTransportId, cTransportId);
|
||||
env->DeleteLocalRef(jRtpParameters);
|
||||
env->ReleaseStringUTFChars(jRtpParameters, cRtpParameters);
|
||||
env->DeleteLocalRef(jCallbackClazz);
|
||||
return std::future<std::string>();
|
||||
promise.set_value(result);
|
||||
this-> env->DeleteLocalRef(jResult);
|
||||
this-> env->DeleteLocalRef(jKind);
|
||||
this-> env->ReleaseStringUTFChars(jKind, cKind);
|
||||
this-> env->DeleteLocalRef(jResult);
|
||||
this-> env->ReleaseStringUTFChars(jResult, cResult);
|
||||
this-> env->DeleteLocalRef(jTransportId);
|
||||
this-> env->ReleaseStringUTFChars(jTransportId, cTransportId);
|
||||
this-> env->DeleteLocalRef(jRtpParameters);
|
||||
this-> env->ReleaseStringUTFChars(jRtpParameters, cRtpParameters);
|
||||
this-> env->DeleteLocalRef(jCallbackClazz);
|
||||
return promise.get_future();
|
||||
}
|
||||
|
||||
std::future<std::string> OnProduceData(mediasoupclient::SendTransport *transport, const nlohmann::json &sctpStreamParameters, const std::string &label, const std::string &protocol, const nlohmann::json &appData) override {
|
||||
@@ -95,23 +97,23 @@ namespace acgist {
|
||||
}
|
||||
|
||||
std::future<void> OnConnect(mediasoupclient::Transport *transport, const nlohmann::json &dtlsParameters) override {
|
||||
jclass jCallbackClazz = env->GetObjectClass(this->routerCallback);
|
||||
jclass jCallbackClazz = this->env->GetObjectClass(this->routerCallback);
|
||||
jmethodID recvTransportConnectCallback = this->env->GetMethodID(jCallbackClazz, "recvTransportConnectCallback", "(Ljava/lang/String;Ljava/lang/String;)V");
|
||||
const char *cTransportId = transport->GetId().data();
|
||||
jstring jTransportId = env->NewStringUTF(cTransportId);
|
||||
jstring jTransportId = this-> env->NewStringUTF(cTransportId);
|
||||
const char *cDtlsParameters = dtlsParameters.dump().data();
|
||||
jstring jDtlsParameters = env->NewStringUTF(cDtlsParameters);
|
||||
jstring jDtlsParameters = this-> env->NewStringUTF(cDtlsParameters);
|
||||
this->env->CallVoidMethod(
|
||||
this->routerCallback,
|
||||
recvTransportConnectCallback,
|
||||
jTransportId,
|
||||
jDtlsParameters
|
||||
);
|
||||
env->DeleteLocalRef(jTransportId);
|
||||
env->ReleaseStringUTFChars(jTransportId, cTransportId);
|
||||
env->DeleteLocalRef(jDtlsParameters);
|
||||
env->ReleaseStringUTFChars(jDtlsParameters, cDtlsParameters);
|
||||
env->DeleteLocalRef(jCallbackClazz);
|
||||
this-> env->DeleteLocalRef(jTransportId);
|
||||
this-> env->ReleaseStringUTFChars(jTransportId, cTransportId);
|
||||
this-> env->DeleteLocalRef(jDtlsParameters);
|
||||
this-> env->ReleaseStringUTFChars(jDtlsParameters, cDtlsParameters);
|
||||
this-> env->DeleteLocalRef(jCallbackClazz);
|
||||
return std::future<void>();
|
||||
}
|
||||
|
||||
@@ -121,6 +123,46 @@ namespace acgist {
|
||||
|
||||
};
|
||||
|
||||
class ProducerListener : public mediasoupclient::Producer::Listener {
|
||||
|
||||
public:
|
||||
Room *room;
|
||||
JNIEnv *env;
|
||||
jobject routerCallback;
|
||||
|
||||
public:
|
||||
ProducerListener(Room *room, JNIEnv *env, jobject routerCallback) {
|
||||
this->room = room;
|
||||
this->env = env;
|
||||
this->routerCallback = routerCallback;
|
||||
}
|
||||
|
||||
void OnTransportClose(mediasoupclient::Producer *producer) override {
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class ConsumerListener : public mediasoupclient::Consumer::Listener {
|
||||
|
||||
public:
|
||||
Room *room;
|
||||
JNIEnv *env;
|
||||
jobject routerCallback;
|
||||
|
||||
public:
|
||||
ConsumerListener(Room *room, JNIEnv *env, jobject routerCallback) {
|
||||
this->room = room;
|
||||
this->env = env;
|
||||
this->routerCallback = routerCallback;
|
||||
}
|
||||
|
||||
void OnTransportClose(mediasoupclient::Consumer *consumer) override {
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Room::Room(
|
||||
std::string roomId,
|
||||
JNIEnv *env,
|
||||
@@ -132,6 +174,8 @@ namespace acgist {
|
||||
this->device = new mediasoupclient::Device();
|
||||
this->sendListener = new SendListener(this, env, routerCallback);
|
||||
this->recvListener = new RecvListener(this, env, routerCallback);
|
||||
this->producerListener = new ProducerListener(this, env, routerCallback);
|
||||
this->consumerListener = new ConsumerListener(this, env, routerCallback);
|
||||
}
|
||||
|
||||
Room::~Room() {
|
||||
@@ -140,8 +184,12 @@ namespace acgist {
|
||||
delete this->sendTransport;
|
||||
delete this->recvListener;
|
||||
delete this->recvTransport;
|
||||
env->DeleteLocalRef(this->routerCallback);
|
||||
env->DeleteGlobalRef(this->routerCallback);
|
||||
delete this->audioProducer;
|
||||
delete this->videoProducer;
|
||||
delete this->producerListener;
|
||||
delete this->consumerListener;
|
||||
this-> env->DeleteLocalRef(this->routerCallback);
|
||||
this-> env->DeleteGlobalRef(this->routerCallback);
|
||||
}
|
||||
|
||||
void Room::enter(
|
||||
@@ -184,10 +232,86 @@ namespace acgist {
|
||||
);
|
||||
}
|
||||
|
||||
void Room::produceMedia(webrtc::MediaStreamInterface mediaStream) {
|
||||
// this->device->CanProduce();
|
||||
void Room::mediaProduceAudio(webrtc::MediaStreamInterface *mediaStream) {
|
||||
if(!this->device->CanProduce("audio")) {
|
||||
return;
|
||||
}
|
||||
nlohmann::json codecOptions =
|
||||
{
|
||||
{ "opusStereo", true },
|
||||
{ "opusDtx", true }
|
||||
};
|
||||
this->audioProducer = this->sendTransport->Produce(
|
||||
this->producerListener,
|
||||
mediaStream->GetAudioTracks()[0],
|
||||
nullptr,
|
||||
&codecOptions,
|
||||
nullptr
|
||||
);
|
||||
}
|
||||
|
||||
void Room::mediaProduceVideo(webrtc::MediaStreamInterface *mediaStream) {
|
||||
if(this->device->CanProduce("video")) {
|
||||
return;
|
||||
}
|
||||
// TODO:配置读取
|
||||
nlohmann::json codecOptions =
|
||||
{
|
||||
{ "videoGoogleStartBitrate", 400 },
|
||||
{ "videoGoogleMinBitrate", 800 },
|
||||
{ "videoGoogleMaxBitrate", 1600 }
|
||||
};
|
||||
// 设置动态码率,帧率、分辨率在摄像头初始化处设置。
|
||||
// 如果需要使用`Simulcast`打开下面配置
|
||||
// std::vector<webrtc::RtpEncodingParameters> encodings;
|
||||
// webrtc::RtpEncodingParameters min;
|
||||
// webrtc::RtpEncodingParameters mid;
|
||||
// webrtc::RtpEncodingParameters max;
|
||||
// min.active = true;
|
||||
// min.max_framerate = 15;
|
||||
// min.min_bitrate_bps = 400;
|
||||
// min.max_bitrate_bps = 800;
|
||||
// encodings.emplace_back(min);
|
||||
// encodings.emplace_back(mid);
|
||||
// encodings.emplace_back(max);
|
||||
// 强制设置编码器
|
||||
// nlohmann::json codec = this->device->GetRtpCapabilities()["codec"];
|
||||
this->videoProducer = this->sendTransport->Produce(
|
||||
this->producerListener,
|
||||
mediaStream->GetVideoTracks()[0],
|
||||
nullptr,
|
||||
&codecOptions,
|
||||
nullptr
|
||||
);
|
||||
}
|
||||
|
||||
void Room::mediaConsume(std::string message) {
|
||||
nlohmann::json json = nlohmann::json::parse(message);
|
||||
nlohmann::json body = json["body"];
|
||||
mediasoupclient::Consumer *consumer = this->recvTransport->Consume(
|
||||
this->consumerListener,
|
||||
body["consumerId"],
|
||||
body["producerId"],
|
||||
body["kind"],
|
||||
&body["rtpParameters"]
|
||||
);
|
||||
this->consumers.insert({ consumer->GetId(), consumer });
|
||||
webrtc::MediaStreamTrackInterface* trackPointer = consumer->GetTrack();
|
||||
jclass jCallbackClazz = this->env->GetObjectClass(this->routerCallback);
|
||||
jmethodID consumerNewCallback = this->env->GetMethodID(jCallbackClazz, "consumerNewCallback", "(Ljava/lang/String;J;)V");
|
||||
const char *cMessage = message.data();
|
||||
jstring jMessage = this-> env->NewStringUTF(cMessage);
|
||||
this->env->CallVoidMethod(
|
||||
this->routerCallback,
|
||||
consumerNewCallback,
|
||||
jMessage,
|
||||
(jlong) trackPointer
|
||||
);
|
||||
this-> env->DeleteLocalRef(jMessage);
|
||||
this-> env->ReleaseStringUTFChars(jMessage, cMessage);
|
||||
this-> env->DeleteLocalRef(jCallbackClazz);
|
||||
};
|
||||
|
||||
void Room::close() {
|
||||
delete this->device;
|
||||
}
|
||||
@@ -249,13 +373,79 @@ namespace acgist {
|
||||
Room* room = (Room*) nativeRoomPointer;
|
||||
const char* body = env->GetStringUTFChars(jBody, 0);
|
||||
room->createRecvTransport(body);
|
||||
env->DeleteLocalRef(jBody);
|
||||
env->ReleaseStringUTFChars(jBody, body);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_acgist_taoyao_media_client_Room_nativeProduceMedia(JNIEnv *env, jobject me, jlong nativeRoomPointer, jlong mediaStreamPointer) {
|
||||
Java_com_acgist_taoyao_media_client_Room_nativeMediaProduceAudio(JNIEnv *env, jobject me, jlong nativeRoomPointer, jlong mediaStreamPointer) {
|
||||
Room* room = (Room*) nativeRoomPointer;
|
||||
webrtc::MediaStreamInterface* mediaStream = reinterpret_cast<webrtc::MediaStreamInterface*>(mediaStreamPointer);
|
||||
webrtc::MediaStreamInterface *mediaStream = reinterpret_cast<webrtc::MediaStreamInterface*>(mediaStreamPointer);
|
||||
room->mediaProduceAudio(mediaStream);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_acgist_taoyao_media_client_Room_nativeMediaProduceVideo(JNIEnv *env, jobject me, jlong nativeRoomPointer, jlong mediaStreamPointer) {
|
||||
Room* room = (Room*) nativeRoomPointer;
|
||||
webrtc::MediaStreamInterface *mediaStream = reinterpret_cast<webrtc::MediaStreamInterface*>(mediaStreamPointer);
|
||||
room->mediaProduceVideo(mediaStream);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_acgist_taoyao_media_client_Room_nativeMediaConsume(JNIEnv *env, jobject me, jlong nativeRoomPointer, jstring jMessage) {
|
||||
Room* room = (Room*) nativeRoomPointer;
|
||||
const char *message = env->GetStringUTFChars(jMessage, 0);
|
||||
room->mediaConsume(message);
|
||||
env->DeleteLocalRef(jMessage);
|
||||
env->ReleaseStringUTFChars(jMessage, message);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_acgist_taoyao_media_client_Room_nativeMediaProducerPause(JNIEnv *env, jobject me, jlong nativeRoomPointer, jstring jProducerId) {
|
||||
Room* room = (Room*) nativeRoomPointer;
|
||||
const char *producerId = env->GetStringUTFChars(jProducerId, 0);
|
||||
env->DeleteLocalRef(jProducerId);
|
||||
env->ReleaseStringUTFChars(jProducerId, producerId);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_acgist_taoyao_media_client_Room_nativeMediaProducerResume(JNIEnv *env, jobject me, jlong nativeRoomPointer, jstring jProducerId) {
|
||||
Room* room = (Room*) nativeRoomPointer;
|
||||
const char *producerId = env->GetStringUTFChars(jProducerId, 0);
|
||||
env->DeleteLocalRef(jProducerId);
|
||||
env->ReleaseStringUTFChars(jProducerId, producerId);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_acgist_taoyao_media_client_Room_nativeMediaProducerClose(JNIEnv *env, jobject me, jlong nativeRoomPointer, jstring jProducerId) {
|
||||
Room* room = (Room*) nativeRoomPointer;
|
||||
const char *producerId = env->GetStringUTFChars(jProducerId, 0);
|
||||
env->DeleteLocalRef(jProducerId);
|
||||
env->ReleaseStringUTFChars(jProducerId, producerId);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_acgist_taoyao_media_client_Room_nativeMediaConsumerPause(JNIEnv *env, jobject me, jlong nativeRoomPointer, jstring jConsumerId) {
|
||||
Room* room = (Room*) nativeRoomPointer;
|
||||
const char *consumerId = env->GetStringUTFChars(jConsumerId, 0);
|
||||
env->DeleteLocalRef(jConsumerId);
|
||||
env->ReleaseStringUTFChars(jConsumerId, consumerId);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_acgist_taoyao_media_client_Room_nativeMediaConsumerResume(JNIEnv *env, jobject me, jlong nativeRoomPointer, jstring jConsumerId) {
|
||||
Room* room = (Room*) nativeRoomPointer;
|
||||
const char *consumerId = env->GetStringUTFChars(jConsumerId, 0);
|
||||
env->DeleteLocalRef(jConsumerId);
|
||||
env->ReleaseStringUTFChars(jConsumerId, consumerId);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_acgist_taoyao_media_client_Room_nativeMediaConsumerClose(JNIEnv *env, jobject me, jlong nativeRoomPointer, jstring jConsumerId) {
|
||||
Room* room = (Room*) nativeRoomPointer;
|
||||
const char *consumerId = env->GetStringUTFChars(jConsumerId, 0);
|
||||
env->DeleteLocalRef(jConsumerId);
|
||||
env->ReleaseStringUTFChars(jConsumerId, consumerId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user