1.通过jni调用librtmp
下面是jni中提供给java调用的本地方法:
public final class PublishJni {
static {
System.loadLibrary("publish");
}
static native long init(String url, int w, int h, int timeOut);
static native int sendSpsAndPps(long cptr, byte[] sps, int spsLen, byte[] pps,
int ppsLen, long timestamp);
static native int sendVideoData(long cptr, byte[] data, int len, long timestamp);
static native int sendAacSpec(long cptr, byte[] data, int len);
static native int sendAacData(long cptr, byte[] data, int len, long timestamp);
static native int stop(long cptr);
}
#include <jni.h>
#include <string>
#include "Rtmp.h"
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jlong JNICALL
Java_com_blueberry_media_PublishJni_init(JNIEnv *env, jclass type, jstring url_, jint w, jint h,
jint timeOut) {
const char *url = env->GetStringUTFChars(url_, 0);
Rtmp *rtmp = new Rtmp();
rtmp->init(url, w, h, timeOut);
env->ReleaseStringUTFChars(url_, url);
return reinterpret_cast<long> (rtmp);
}
JNIEXPORT jint JNICALL
Java_com_blueberry_media_PublishJni_sendSpsAndPps(JNIEnv *env, jclass type, jlong cptr,
jbyteArray sps_, jint spsLen, jbyteArray pps_,
jint ppsLen, jlong timestamp) {
jbyte *sps = env->GetByteArrayElements(sps_, NULL);
jbyte *pps = env->GetByteArrayElements(pps_, NULL);
Rtmp *rtmp = reinterpret_cast<Rtmp *>(cptr);
int ret = rtmp->sendSpsAndPps((BYTE *) sps, spsLen, (BYTE *) pps, ppsLen, timestamp);
env->ReleaseByteArrayElements(sps_, sps, 0);
env->ReleaseByteArrayElements(pps_, pps, 0);
return ret;
}
JNIEXPORT jint JNICALL
Java_com_blueberry_media_PublishJni_sendVideoData(JNIEnv *env, jclass type, jlong cptr,
jbyteArray data_, jint len, jlong timestamp) {
jbyte *data = env->GetByteArrayElements(data_, NULL);
Rtmp *rtmp = reinterpret_cast<Rtmp *> (cptr);
int ret = rtmp->sendVideoData((BYTE *) data, len, timestamp);
env->ReleaseByteArrayElements(data_, data, 0);
return ret;
}
JNIEXPORT jint JNICALL
Java_com_blueberry_media_PublishJni_sendAacSpec(JNIEnv *env, jclass type, jlong cptr,
jbyteArray data_, jint len) {
jbyte *data = env->