通过TCP和RTSP通过Android中的Wi-Fi或LAN流式传输客户端

时间:2015-01-06 08:41:57

标签: android tcp ffmpeg streaming

我正在努力开发DVR摄像机的流媒体客户端,我尝试通过RTSP协议使用VLC媒体播放器我得到了解决方案(使用Wi-Fi标准模型,如Netgear等),但相同的代码不支持其他Wi-Fi调制解调器,现在正在使用FFMPEG框架在Android中使用JNI API实现流客户端。没有任何正确的想法来实现JNI api

使用IP Cam Viewer应用

的网络摄像头

下面的代码,

/*****************************************************/
/* functional call */
/*****************************************************/

jboolean Java_FFmpeg_allocateBuffer( JNIEnv* env, jobject thiz )
{

    // Allocate an AVFrame structure
    pFrameRGB=avcodec_alloc_frame();
    if(pFrameRGB==NULL)
        return 0;
sprintf(debugMsg, "%d %d", screenWidth, screenHeight);
INFO(debugMsg);
    // Determine required buffer size and allocate buffer
    numBytes=avpicture_get_size(dstFmt, screenWidth, screenHeight);
/*
    numBytes=avpicture_get_size(dstFmt, pCodecCtx->width,
                  pCodecCtx->height);
*/
    buffer=(uint8_t *)av_malloc(numBytes * sizeof(uint8_t));

    // Assign appropriate parts of buffer to image planes in pFrameRGB
    // Note that pFrameRGB is an AVFrame, but AVFrame is a superset
    // of AVPicture
    avpicture_fill((AVPicture *)pFrameRGB, buffer, dstFmt, screenWidth, screenHeight);

    return 1;
}


/* for each decoded frame */
jbyteArray Java_FFmpeg_getNextDecodedFrame( JNIEnv* env, jobject thiz )
{


av_free_packet(&packet);

while(av_read_frame(pFormatCtx, &packet)>=0) {

    if(packet.stream_index==videoStream) {

        avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);

        if(frameFinished) {     

        img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, screenWidth, screenHeight, dstFmt, SWS_BICUBIC, NULL, NULL, NULL);

/*
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, dstFmt, SWS_BICUBIC, NULL, NULL, NULL);
*/

        sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize,
     0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);

++frameCount;

        /* uint8_t == unsigned 8 bits == jboolean */
        jbyteArray nativePixels = (*env)->NewByteArray(env, numBytes);
        (*env)->SetByteArrayRegion(env, nativePixels, 0, numBytes, buffer);
        return nativePixels;
        }

    }

    av_free_packet(&packet);
}

return NULL;
}

/*****************************************************/
/* / functional call */
/*****************************************************/


jstring
Java_FFmpeg_play( JNIEnv* env, jobject thiz, jstring jfilePath )
{
    INFO("--- Play");
char* filePath = (char *)(*env)->GetStringUTFChars(env, jfilePath, NULL);
RE(filePath);

/*****************************************************/

  AVFormatContext *pFormatCtx;
  int             i, videoStream;
  AVCodecContext  *pCodecCtx;
  AVCodec         *pCodec;
  AVFrame         *pFrame; 
  AVPacket        packet;
  int             frameFinished;
  float           aspect_ratio;
  struct SwsContext *img_convert_ctx;

INFO(filePath);

/* FFmpeg */

  av_register_all();

  if(av_open_input_file(&pFormatCtx, filePath, NULL, 0, NULL)!=0)
    RE("failed av_open_input_file ");

  if(av_find_stream_info(pFormatCtx)<0)
        RE("failed av_find_stream_info");

  videoStream=-1;
  for(i=0; i<pFormatCtx->nb_streams; i++)
    if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
      videoStream=i;
      break;
    }
  if(videoStream==-1)
        RE("failed videostream == -1");

  pCodecCtx=pFormatCtx->streams[videoStream]->codec;

  pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
  if(pCodec==NULL) {
    RE("Unsupported codec!");
  }

  if(avcodec_open(pCodecCtx, pCodec)<0)
    RE("failed codec_open");

  pFrame=avcodec_alloc_frame();

/* /FFmpeg */

INFO("codec name:");
INFO(pCodec->name);
INFO("Getting into stream decode:");

/* video stream */

  i=0;
  while(av_read_frame(pFormatCtx, &packet)>=0) {

    if(packet.stream_index==videoStream) {
      avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
      if(frameFinished) {
++i;
INFO("frame finished");

    AVPicture pict;
/*
    img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,
 pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height,
 PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);

    sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize,
 0, pCodecCtx->height, pict.data, pict.linesize);
*/
      }
    }
    av_free_packet(&packet);
  }

/* /video stream */

  av_free(pFrame);

  avcodec_close(pCodecCtx);

  av_close_input_file(pFormatCtx);

  RE("end of main");
}

我无法从网络摄像头获取帧

并想一想在Android中实现DVR摄像机的直播客户端

0 个答案:

没有答案