android librtmp 推送h264流 aac流 基本过程总结四 推流x264

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(&param, "baseline");//鏍稿骞朵慨鏀归儴鍒嗛潪娉曞弬鏁?
	 args->encoder = x264_encoder_open(&param);//鎵撳紑缂栫爜鍣?

 	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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值