您的位置:首页 > 其它

用libx264对视频数据进行编码的步骤

2013-05-08 16:00 309 查看
一、初始化

x264_param_t        *param264Encode;
x264_t              *encoder264;
x264_picture_t      *picture264In;
x264_picture_t      *picture264Out;

AVFrame             *encodeSrcFrame;

encodeSize=CGSizeMake(size.width, size.height);

int encodeWidth=encodeSize.width;
int encodeHeight=encodeSize.height;

encodeSrcFrame=avcodec_alloc_frame();
picture264In=malloc(sizeof(x264_picture_t));
picture264Out=malloc(sizeof(x264_picture_t));
param264Encode=malloc(sizeof(x264_param_t));

x264_param_default(param264Encode);
x264_param_default_preset(param264Encode, "faster", "zerolatency");

param264Encode->i_csp=X264_CSP_I420;
param264Encode->i_width=encodeWidth;
param264Encode->i_height=encodeHeight;
param264Encode->i_fps_num=fps;
param264Encode->i_fps_den=1;
param264Encode->i_keyint_max=100;
param264Encode->i_keyint_min=50;
param264Encode->rc.i_rc_method=X264_RC_CQP;
param264Encode->rc.f_rf_constant=25;
param264Encode->rc.f_rf_constant_max=35;
x264_param_apply_profile(param264Encode, "baseline");

encoder264=x264_encoder_open(param264Encode);

二、编码,输入值为一帧RBGA格式的视频数据,返回为一数组,其保存着h264编码后的nal.

-(NSArray*)encodeVideDataWithx264Encoder:(NSData*)data{
NSMutableArray *arrNals=[[NSMutableArray alloc] init];
uint8_t *src=(uint8_t*)[data bytes];
avpicture_fill((AVPicture*)encodeSrcFrame, src, PIX_FMT_NV12, encodeSize.width, encodeSize.height);
if(x264_picture_alloc(picture264In, X264_CSP_I420, encodeSize.width, encodeSize.height)<0){
TTDCONDITIONLOG(LogFlagEncode, @"x264 picture in alloc error.");
}

if(encodeSwsContext==NULL){
encodeSwsContext=sws_getCachedContext(encodeSwsContext, encodeSize.width, encodeSize.height, PIX_FMT_NV12, encodeSize.width, encodeSize.height, PIX_FMT_YUV420P, SWS_FAST_BILINEAR, NULL, NULL, NULL);
}
sws_scale(encodeSwsContext, (const uint8_t* const*)encodeSrcFrame->data, encodeSrcFrame->linesize, 0, encodeSize.height, picture264In->img.plane, picture264In->img.i_stride);

x264_nal_t  *nals;
int i_nals;
int frame_size=x264_encoder_encode(encoder264, &nals, &i_nals, picture264In, picture264Out);
if(frame_size>0){
TTDCONDITIONLOG(LogFlagEncode, @"x264 encode nal type:%d,nal units count:%d",nals->i_type,i_nals);
if(i_nals>1){
for(int i=0;i<i_nals;i++){
@autoreleasepool {
NSData *nalData=[[NSData alloc] initWithBytes:nals[i].p_payload length:nals[i].i_payload];
[arrNals addObject:nalData];
[nalData release];
}
}
}
}
else{
TTDCONDITIONLOG(LogFlagEncode, @"x264_encoder return value error:%d",frame_size);
}
x264_picture_clean(picture264In);
return [arrNals autorelease];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐