live555Android2.cpp
#include "include/BasicUsageEnvironment.hh"
#include "include/liveMedia.hh"
#include <jni.h>
#include <stdio.h>
#include <string.h>
#include <android/log.h>
#define LOG_TAG "myRTSPServer"
#define LOGW(a ) __android_log_write(ANDROID_LOG_WARN,LOG_TAG,a)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
UsageEnvironment* env;
Boolean reuseFirstSource = False;//组播时是否按照已经播放中(另一先打开的客户端)进度播放
Boolean iFramesOnly = False;
static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,
char const* streamName, char const* inputFileName); // fwd
static char newMatroskaDemuxWatchVariable;
static MatroskaFileServerDemux* demux;
static void onMatroskaDemuxCreation(MatroskaFileServerDemux* newDemux, void* /*clientData*/) {
demux = newDemux;
newMatroskaDemuxWatchVariable = 1;
}
extern "C"JNIEXPORT jstring JNICALL Java_com_example_live555_LiveNative_Init(JNIEnv *env1, jobject obj)
{
TaskScheduler* scheduler = BasicTaskScheduler::createNew();
env = BasicUsageEnvironment::createNew(*scheduler);
UserAuthenticationDatabase* authDB = NULL;
RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554, authDB);
if (rtspServer == NULL) {
LOGI("Failed to create RTSP server:%s",env->getResultMsg());
exit(1);
}else{
LOGI("create RTSP server successful in 8554!");
}
char const* descriptionString
= "Session streamed by \"h264test\"";
// A H.264 video elementary stream:
{
char const* streamName = "h264test";//播放请求时要输入的别名eg:rtsp://192.168.31.233:8554/h264test即代表请求的播放流为test.264
char const* inputFileName = "/sdcard/Muxer/test.264";
/* if(fopen("/sdcard/Muxer/fifo1.264","rb")){
LOGI("open test.264 succcessful");
}else{
LOGI("open test.264 failed!");
}*/
ServerMediaSession* sms
= ServerMediaSession::createNew(*env, streamName, streamName,
descriptionString);
sms->addSubsession(H264VideoFileServerMediaSubsession
::createNew(*env, inputFileName, reuseFirstSource));
rtspServer->addServerMediaSession(sms);
announceStream(rtspServer, sms, streamName, inputFileName);
}
//创建ts流对话
{
char const* streamName = "ts";
char const* inputFileName = "/sdcard/Muxer/test.ts";
char const* indexFileName = "test.tsx";
ServerMediaSession* sms
= ServerMediaSession::createNew(*env, streamName, streamName,
descriptionString);
sms->addSubsession(MPEG2TransportFileServerMediaSubsession
::createNew(*env, inputFileName, indexFileName, reuseFirstSource));
rtspServer->addServerMediaSession(sms);
announceStream(rtspServer, sms, streamName, inputFileName);
}
if (rtspServer->setUpTunnelingOverHTTP(80) || rtspServer->setUpTunnelingOverHTTP(8000) || rtspServer->setUpTunnelingOverHTTP(8080)) {
LOGI("we usr port-->%d",rtspServer->httpServerPortNum());
} else {
LOGI("RTSP-over-HTTP tunneling is not available.");
}
env->taskScheduler().doEventLoop();
return 0;
}
static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,
char const* streamName, char const* inputFileName) {
char* url = rtspServer->rtspURL(sms);
char buf[255] = {0};
UsageEnvironment& env = rtspServer->envir();
sprintf(buf,"%s-->stream, from the file-->%s,Play this stream using the URL:%s",streamName,inputFileName,url);
LOGW(buf);
delete[] url;
}
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := live5551
LOCAL_SRC_FILES := libs/armeabi/liblive555.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := live5552
LOCAL_SRC_FILES := live555Android2.cpp
LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/include/
LOCAL_SHARED_LIBRARIES := liblive5551
LOCAL_LDLIBS := -llog -lz -lm
include $(BUILD_SHARED_LIBRARY)