[*] 才子词人 自是白衣卿相

This commit is contained in:
acgist
2023-04-08 15:14:56 +08:00
parent 9978039c9d
commit 8f2f0dd1a8
14 changed files with 673 additions and 237 deletions

View File

@@ -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);
}
}