int y_length;
int uv_length;
-JNIEXPORT void JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_init__ (JNIEnv *env, jobject obj ){
+JNIEXPORT void JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_init (JNIEnv *env, jobject obj ){
LOGE("########## Ffmpeg Init ##########");
unsigned int v = avutil_version();
LOGE("libavutil - %d.%d.%d", AV_VERSION_MAJOR(v), AV_VERSION_MINOR(v), AV_VERSION_MICRO(v));
v = avdevice_version();
LOGE("libavdevice - %d.%d.%d", AV_VERSION_MAJOR(v), AV_VERSION_MINOR(v), AV_VERSION_MICRO(v));
+ //system("su -c chmod 666 /dev/video0");
+ system("/system/xbin/su -c echo 'wowo' >> /data/local/test");
+ system("echo 'wowow' >> /sdcard/peng/test");
+
av_log_set_level(AV_LOG_TRACE);
av_register_all();
avdevice_register_all();
return env->NewStringUTF("====== Ffmpeg call =======");
}
-JNIEXPORT jint JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_init (JNIEnv *env, jobject obj, jint width, jint height) {
+//const char* out_path;
+
+JNIEXPORT void JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_setRtmpUrl (JNIEnv *env, jobject obj, jstring url){
+ LOGE("set rtmpurl");
+ //const char* out_path = "rtmp://gpussh.suanzi.ai:1935/myapp/suanzi_ac83f34ead90_cameraid";
+ //out_path = env->GetStringUTFChars(url, 0);
+
+}
+JNIEXPORT jint JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_initnew (JNIEnv *env, jobject obj, jint width, jint height, jstring url)
+{
+ const char * out_path= env->GetStringUTFChars(url, 0);
+ LOGE("Ffmpeg init, width=%d, heigh=%d, url=%s", width, height, out_path);
+
+ yuv_width=width;
+ yuv_height=height;
+ y_length=width*height;
+ uv_length=width*height/4;
+
+
+ av_register_all();
+
+ //output initialize
+ avformat_alloc_output_context2(&ofmt_ctx, NULL, "flv", out_path);
+ //output encoder initialize
+ pCodec = avcodec_find_encoder(AV_CODEC_ID_H264);
+ if (!pCodec){
+ LOGE("Can not find encoder!\n");
+ return -1;
+ }
+ pCodecCtx = avcodec_alloc_context3(pCodec);
+ pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
+ pCodecCtx->width = width;
+ pCodecCtx->height = height;
+ pCodecCtx->time_base.num = 1;
+ pCodecCtx->time_base.den = 30;
+ pCodecCtx->bit_rate = 800000;
+ pCodecCtx->gop_size = 300;
+ /* Some formats want stream headers to be separate. */
+ if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
+ pCodecCtx->flags |= CODEC_FLAG_GLOBAL_HEADER;
+
+ //H264 codec param
+ //pCodecCtx->me_range = 16;
+ //pCodecCtx->max_qdiff = 4;
+ //pCodecCtx->qcompress = 0.6;
+ pCodecCtx->qmin = 10;
+ pCodecCtx->qmax = 51;
+ //Optional Param
+ pCodecCtx->max_b_frames = 3;
+ // Set H264 preset and tune
+ AVDictionary *param = 0;
+ av_dict_set(¶m, "preset", "ultrafast", 0);
+ av_dict_set(¶m, "tune", "zerolatency", 0);
+
+ if (avcodec_open2(pCodecCtx, pCodec, ¶m) < 0){
+ LOGE("Failed to open encoder!\n");
+ return -1;
+ }
+
+ //Add a new stream to output,should be called by the user before avformat_write_header() for muxing
+ video_st = avformat_new_stream(ofmt_ctx, pCodec);
+ if (video_st == NULL){
+ return -1;
+ }
+ video_st->time_base.num = 1;
+ video_st->time_base.den = 30;
+ video_st->codec = pCodecCtx;
+
+ //Open output URL,set before avformat_write_header() for muxing
+ jint ret = 0;
+ if (( ret = avio_open(&ofmt_ctx->pb, out_path, AVIO_FLAG_READ_WRITE)) < 0){
+ LOGE("Failed to open output file! return :%s(%d)\n", av_err2str(ret),ret);
+ return -1;
+ }
+
+ //Write File Header
+ avformat_write_header(ofmt_ctx, NULL);
+
+ start_time = av_gettime();
+ env->ReleaseStringUTFChars(url, out_path);
+ return 0;
+
+}
+
+JNIEXPORT jint JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_inithaha (JNIEnv *env, jobject obj, jint width, jint height) {
//const char* out_path = "/storage/emulated/0/Movies/output.flv";
return 0;
}
+
+
+JNIEXPORT jint JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_processnew (JNIEnv *env, jobject obj, jbyteArray yuv){
+
+}
+
+
+
JNIEXPORT jint JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_process (JNIEnv *env, jobject obj, jbyteArray yuv){
int ret;
int enc_got_frame=0;
av_frame_free(&pFrameYUV);
if (enc_got_frame == 1){
- //LOGE("Succeed to encode frame: %5d\tsize:%5d\n", framecnt, enc_pkt.size);
+ if (framecnt % (15 * 60) == 0){
+ LOGE("Succeed to encode frame: %5d\tsize:%5d\n", framecnt, enc_pkt.size);
+ }
framecnt++;
enc_pkt.stream_index = video_st->index;
ret = av_interleaved_write_frame(ofmt_ctx, &enc_pkt);
av_free_packet(&enc_pkt);
}
+ av_free(out_buffer);
return 0;
}
// av_log_set_callback(custom_log);
// Open Output
//const char* out_path = "rtmp://192.168.1.35:1935/myapp/peng2";
- //const char* out_path = "rtmp://gpussh.suanzi.ai:1935/myapp/suanzi_ac83f34ead90_cameraid";
- const char* out_path = env->GetStringUTFChars(url, 0);
+ const char* out_path = "rtmp://gpussh.suanzi.ai:1935/myapp/suanzi_ac83f34ead90_cameraid";
+ //const char* out_path = env->GetStringUTFChars(url, 0);
//const char * file_name = env->GetStringUTFChars(fname, 0);