Android下live555转发本地视频

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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值