android librtmp 推送h264流 aac流 基本过程总结三 推流x264
1. x264初始化配置注意:这里边我踩了一些坑,rtmp 推流过程中去掉nal中pps,sps,只允许一帧中只有一个nal片,之前测试初始化x264参数没注意到这个问题导致自己推流再nginx服务器中没有正确的切成ts流,播放异常。另外需要注意推流的时候一定要跟faac流一个时间线,要不然会出现音视频不同步,或者视频中没有音频流的现象都是有可能发生的typedef struct x264_args { x264_t *encoder; //锟斤拷锟斤拷锟斤拷 int64_t i_pts; //锟斤拷锟斤拷帧锟斤拷锟斤拷 int outf; int width; int height; int init_flag; AVFrame * png_frame; #if H264_TO_MP4_SUPPORT Mp4Args mp4_args; #endif x264_picture_t pic_in; x264_picture_t pic_out;//x264锟斤拷x264_picture_t 锟斤拷示帧锟斤拷锟斤拷锟斤拷前锟斤拷锟斤拷锟斤拷 }X264Args;
定义x264普通的结构体
int X264encode_Init_Args_ForRtmp(X264Args *args, char *name,int width, int height) { if (args == NULL ) { return -1; } Thread_Lock_By_Kind(THREAD_LOCK_X264_ENCODE); FilterArgs * png_args = NULL ; int ret = 0; int FPS = GOAL_FPS; x264_param_t param; args->i_pts = 0; args->width = width; args->height = height; dmprint_string("encode start"); x264_param_default_preset(¶m, "superfast", "zerolatency");//0延时 对实时性有保证 param.i_level_idc=30;//算法的复杂度 param.i_threads = X264_SYNC_LOOKAHEAD_AUTO;//linux可以设置0,主要为了防止开启多线程导致输出NAL片段多,这样保证一桢只有一个NAL // 否则有几个线程,在编码成几个NALU。缺省为true。 param.b_sliced_threads = false; param.rc.b_mb_tree = 0;//这个不为0,将导致编码延时帧...在实时编码时,必须为0 // 该参数设置是让每个I帧都附带sps/pps。// param.b_repeat_headers = 1; // 重复SPS/PPS 放到关键帧前面 // param.b_repeat_headers = 0; param.i_width = width; param.i_height = height; param.i_fps_num = FPS; param.i_fps_den = 1; param.i_csp = X264_CSP_I420;// param.i_keyint_min = FPS * 1; param.i_keyint_max = FPS * 2; param.rc.i_qp_min = 18; // param.rc.i_qp_max =31; //xiaoyu 70 param.analyse.i_me_range = 16; param.rc.i_qp_step = 2; // param.rc.i_rc_method = X264_RC_CQP; // param.rc.i_qp_constant = 23; x264_param_apply_profile(¶m, "baseline");//鏍稿骞朵慨鏀归儴鍒嗛潪娉曞弬鏁? args->encoder = x264_encoder_open(¶m);//鎵撳紑缂栫爜鍣? x264_picture_alloc(&args->pic_in, X264_CSP_I420, width, height);//鐢宠涓€甯у唴瀛? #if LINUX_VERSION || ANDROID_VERSION free(args->pic_in.img.plane[0] ); #else free( *( ( ( void **) args->pic_in.img.plane[0] ) - 1 ) ); #endif //鐢宠珛铏曠悊鐨勭珐瀛樺唴瀛? if (is_watermark_flag) { png_args = get_filter_args(width,height,AV_PIX_FMT_YUV420P); Filter_Alloc_Frame(&args->png_frame,png_args); Frame_Add_WaterMark(width,height,AV_PIX_FMT_YUV420P,2); free(png_args); } args->init_flag = 1; //end: if (ret < 0) { /*close(args->outf);//鍏抽棴鏂囦欢 */x264_encoder_close(arg
android librtmp 推送h264流 aac流 基本过程总结四 推流x264
最新推荐文章于 2023-12-29 17:04:29 发布