如何编译引入x264
正式编码
#include <stdint.h>
#include <x264.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#define CLEAR(x) (memset((&x),0,sizeof(x)))
#define IMAGE_WIDTH 1920
#define IMAGE_HEIGHT 1080
#define ENCODER_PRESET "veryfast"
#define ENCODER_TUNE "zerolatency"
#define ENCODER_PROFILE "baseline"
#define ENCODER_COLORSPACE X264_CSP_I420
typedef struct my_x264_encoder
{
x264_param_t* x264_parameter;
char parameter_preset[20];
char parameter_tune[20];
char parameter_profile[20];
x264_t* x264_encoder;
x264_picture_t* yuv420p_picture;
long colorspace;
unsigned char* yuv;
x264_nal_t* nal;
} my_x264_encoder;
char* read_filename = "/Users/jimogangdan/Downloads/video1.yuv";
char* write_filename = "/Users/jimogangdan/CLionProjects/x264_encoder/video1.h264";
int main(int argc, char** argv)
{
int fd_read, fd_write;
my_x264_encoder* encoder = malloc(sizeof(my_x264_encoder));
if (!encoder)
{
printf("cannot malloc my_x264_encoder !\n");
exit(EXIT_FAILURE);
}
CLEAR(*encoder);
strcpy(encoder->parameter_preset, ENCODER_PRESET);
strcpy(encoder->parameter_tune, ENCODER_TUNE);
encoder->x264_parameter = (x264_param_t*)malloc(sizeof(x264_param_t));
if (!encoder->x264_parameter)
{
printf("malloc x264_parameter error!\n");
exit(EXIT_FAILURE);
}
CLEAR(*(encoder->x264_parameter));
x264_param_default(encoder->x264_parameter);
encoder->x264_parameter->i_threads = X264_SYNC_LOOKAHEAD_AUTO;
encoder->x264_parameter->i_width = IMAGE_WIDTH;
encoder->x264_parameter->i_height = IMAGE_HEIGHT;
encoder->x264_parameter->i_frame_total = 0;
encoder->x264_parameter->i_keyint_max = 25;
encoder->x264_parameter->i_bframe = 5;
encoder->x264_parameter->b_open_gop = 0;
encoder->x264_parameter->i_bframe_pyramid = 0;
encoder->x264_parameter->i_bframe_adaptive = X264_B_ADAPT_TRELLIS;
encoder->x264_parameter->i_log_level = X264_LOG_DEBUG;
encoder->x264_parameter->i_fps_den = 1; //码率分母
encoder->x264_parameter->i_fps_num = 25; //码率分子
encoder->x264_parameter->b_intra_refresh = 1;
encoder->x264_parameter->b_annexb = 1;
strcpy(encoder->parameter_profile, ENCODER_PROFILE);
encoder->x264_encoder = x264_encoder_open(encoder->x264_parameter);
encoder->colorspace = ENCODER_COLORSPACE;
encoder->yuv420p_picture = (x264_picture_t*)malloc(sizeof(x264_picture_t));
if (!encoder->yuv420p_picture)
{
printf("malloc encoder->yuv420p_picture error!\n");
exit(EXIT_FAILURE);
}
encoder->yuv420p_picture->img.i_csp = encoder->colorspace;
encoder->yuv420p_picture->img.i_plane = 3;
encoder->yuv420p_picture->i_type = X264_TYPE_AUTO;
encoder->yuv = (uint8_t*)malloc(IMAGE_WIDTH * IMAGE_HEIGHT * 3 / 2);
if (!encoder->yuv)
{
printf("malloc yuv error!\n");
exit(EXIT_FAILURE);
}
CLEAR(*(encoder->yuv));
encoder->yuv420p_picture->img.plane[0] = encoder->yuv;
encoder->yuv420p_picture->img.plane[1] = encoder->yuv + IMAGE_WIDTH * IMAGE_HEIGHT;
encoder->yuv420p_picture->img.plane[2] = encoder->yuv + IMAGE_WIDTH * IMAGE_HEIGHT + IMAGE_WIDTH * IMAGE_HEIGHT / 4;
if ((fd_read = open(read_filename,O_RDONLY)) < 0)
{
printf("cannot open input file!\n");
exit(EXIT_FAILURE);
}
if ((fd_write = open(write_filename,O_WRONLY | O_APPEND | O_CREAT, 0777)) < 0)
{
printf("cannot open output file!\n");
exit(EXIT_FAILURE);
}
int n_nal = 0;
x264_nal_t* my_nal;
encoder->nal = (x264_nal_t*)malloc(sizeof(x264_nal_t));
if (!encoder->nal)
{
printf("malloc x264_nal_t error!\n");
exit(EXIT_FAILURE);
}
CLEAR(*(encoder->nal));
while (read(fd_read, encoder->yuv,IMAGE_WIDTH * IMAGE_HEIGHT * 3 / 2) > 0)
{
encoder->yuv420p_picture->i_pts++;
for (my_nal = encoder->nal; my_nal < encoder->nal + n_nal; ++my_nal)
{
write(fd_write, my_nal->p_payload, my_nal->i_payload);
}
}
free(encoder->yuv);
free(encoder->yuv420p_picture);
free(encoder->x264_parameter);
x264_encoder_close(encoder->x264_encoder);
free(encoder);
close(fd_read);
close(fd_write);
return 0;
}
标签:picture,h264,c99,nal,encoder,x264,parameter,IMAGE
From: https://www.cnblogs.com/guanchaoguo/p/18025198