extern “C” JNIEXPORT jboolean JNICALL
Java_com_bailun_kai_rtmplivedemo_RtmpPack2Remote_connectLiveServer(JNIEnv *env, jobject thiz,
jstring url) {
// 首先 Java 的转成 C 的字符串,不然无法使用
const char *live_url = env->GetStringUTFChars(url,0);
int result;
do {
// 结构体对象分配内存
livePack = (LivePack *)(malloc(sizeof(LivePack)));
// 清空内存上的脏数据
memset(livePack,0,sizeof(LivePack));
// Rtmp 申请内存
livePack->rtmp = RTMP_Alloc();
RTMP_Init(livePack->rtmp);
// 设置 rtmp 初始化参数,比如超时时间、url
livePack->rtmp->Link.timeout = 10;
LOGI(“connect %s”, url);
if (!(result = RTMP_SetupURL(livePack->rtmp,(char *)live_url))){
break;
}
// 开启 Rtmp 写入
RTMP_EnableWrite(livePack->rtmp);
LOGI(“RTMP_Connect”);
if (!(result = RTMP_Connect(livePack->rtmp,0))){
break;
}
LOGI("RTMP_ConnectStream ");
if (!(result = RTMP_ConnectStream(livePack->rtmp, 0)))
break;
LOGI(“connect success”);
}while (0);
if (!result && livePack){
free(livePack);
livePack = nullptr;
}
env->ReleaseStringUTFChars(url,live_url);
return result;
}
发送数据到直播服务器

有意思的是,Rtmp 协议中不需要传递分隔符(h264 分隔符为 0 0 0 1),并且推流的第一个 Rtmp 包的内容为 sps、pps 等
// 发送 rtmp 数据到服务器
extern “C”
JNIEXPORT jboolean JNICALL
Java_com_bailun_kai_rtmplivedemo_RtmpPack2Remote_sendData2Server(JNIEnv *env, jobject thiz,
jbyteArray buffer, jint length,
jlong tms) {
int result;
// 拷贝数据
jbyte *bufferArray = env->GetByteArrayElements(buffer, 0);
result = sendDataInner(bufferArray,length,tms);
//释放内存
env->ReleaseByteArrayElements(buffer,bufferArray,0);
return result;
}
int sendDataInner(jbyte *array, jint length, jlong tms) {
int result = 0;
//处理 sps、pps<

文章详细描述了如何在Java环境中通过JNI调用C代码,实现与Rtmp协议的交互,包括连接直播服务器、处理SPS和PPS数据,以及发送数据到服务器的过程。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



