我正在研究用于编码图像的X264 API。
到目前为止,我已经构建了X264库,下面的代码片段显示了我的能力:
int frame_size;
x264_t* encoder;
x264_picture_t pic_in, pic_out;
x264_param_t x264Param;
int fps = 20;
int width = 1280;
int height = 720;
x264_nal_t* nals;
int i_nals;
x264_param_default_preset(&x264Param, "veryfast", "zerolatency");
x264Param.i_threads = 1;
x264Param.i_width = 1280;
x264Param.i_height = 720;
x264Param.i_fps_num = fps;
x264Param.i_fps_den = 1;
x264Param.i_keyint_max = fps;
x264Param.b_intra_refresh = 1;
x264Param.rc.i_rc_method = X264_RC_CRF;
x264Param.rc.f_rf_constant = 25;
x264Param.rc.f_rf_constant_max = 35;
x264Param.b_repeat_headers = 1;
x264Param.b_annexb = 1;
x264_param_apply_profile(&x264Param, "baseline");
encoder = x264_encoder_open(&x264Param);
x264_picture_alloc(&pic_in, X264_CSP_BGR, width, height);
/* How to fill in bitmap data? */
frame_size = x264_encoder_encode(encoder, &nals, &i_nals, &pic_in, &pic_out);
if (frame_size >= 0)
{
printf("OK\n");
}
所以我试图编码一个24位的BGR位图图像但是,x264头文件没有显示任何用于将位图图像写入编码器的API函数怎么做到的?
编辑
这段代码似乎有效我希望有一个评论和一些意见谢谢。
int frame_size;
int accum_frame_size;
x264_t* encoder;
x264_picture_t pic_in, pic_out;
x264_param_t x264Param;
int fps = 20;
int width = 1280;
int height = 720;
x264_nal_t* nals;
int i_nals;
int64_t frameCount = 0;
int k;
for (k = 0; k < (1280*3*720); k++)
{
bgr[k] = rand();
}
x264_param_default_preset(&x264Param, "veryfast", "zerolatency");
x264Param.i_threads = 1;
x264Param.i_width = 1280;
x264Param.i_height = 720;
x264Param.i_fps_num = fps;
x264Param.i_fps_den = 1;
x264Param.i_keyint_max = fps;
x264Param.b_intra_refresh = 1;
x264Param.rc.i_rc_method = X264_RC_CRF;
x264Param.i_csp = X264_CSP_BGR;
x264Param.rc.f_rf_constant = 25;
x264Param.rc.f_rf_constant_max = 35;
x264Param.b_repeat_headers = 1;
x264Param.b_annexb = 1;
x264_param_apply_profile(&x264Param, "baseline");
encoder = x264_encoder_open(&x264Param);
x264_picture_alloc(&pic_in, X264_CSP_BGR, width, height);
/* Load 24-bit BGR bitmap */
pic_in.img.i_csp = X264_CSP_BGR;
pic_in.img.i_plane = 1;
pic_in.img.i_stride[0] = 3 * 1280;
pic_in.img.plane[0] = bgr;
pic_in.i_pts = frameCount;
pic_in.i_type = X264_TYPE_AUTO;
pic_out.i_pts = frameCount;
/* Returns a frame size of 912 for first frame in this case */
frame_size = x264_encoder_encode(encoder, &nals, &i_nals, &pic_in, &pic_out);
printf("Decoder returned frame size = %d \n", frame_size);
printf("Decoder returned %d NAL units \n", i_nals);
if (frame_size >= 0)
{
int i;
int j;
accum_frame_size = 0;
for (i = 0; i < i_nals; i++)
{
printf("******************* NAL %d (%d bytes) *******************\n", i, nals[i].i_payload);
for (j = 0; j < nals[i].i_payload; j++)
{
if (j == 0) printf("First 10 bytes: ");
if (j < 10) printf("%02X |", nals[i].p_payload[j]);
accum_frame_size++;
}
printf("\n");
}
}
printf("Verified frame size = %d \n", accum_frame_size);
编辑#2
编码器输出:
x264 [error]: baseline profile doesn't support 4:4:4
x264 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
x264 [info]: profile High 4:4:4 Predictive, level 3.1, 4:4:4 8-bit
Decoder returned frame size = 1467194
Decoder returned 4 NAL units
******************* NAL 0 (31 bytes) *******************
First 10 bytes: 00 |00 |00 |01 |67 |F4 |00 |1F |91 |89 |
******************* NAL 1 (8 bytes) *******************
First 10 bytes: 00 |00 |00 |01 |68 |EF |1F |2C |
******************* NAL 2 (595 bytes) *******************
First 10 bytes: 00 |00 |01 |06 |05 |FF |FF |4C |DC |45 |
******************* NAL 3 (1466560 bytes) *******************
First 10 bytes: 00 |00 |01 |65 |88 |82 |0A |FF |F5 |B0 |
Verified frame size = 1467194
每个NAL单元不应该以0x00 0x00 0x00 0x01开始吗?
萨特玛丽:谢谢你的宝贵反馈所以你是说每个NAL单元不一定从0,0,0,1开始不过,我有点不清楚你的答案你的意思是,在某种配置下,NAL单元将从0,0,0,1开始如果是,那是什么配置我需要确保我在网络上发送到远程接收器的每个NAL单元都从0,0,0,1开始在探索x264库之前,我使用了x264 exe,并从x264进程中导入和导出BMP数据然后我分析编码器输出,通过查找0,0,0,1来查找NAL单位如何使用x264库实现相同的功能?
关于libswscale:
我下载了ffmpeg源代码,在MINGW中运行configure和make进程完成后,除了一些.exe文件外,我找不到任何其他文件如何构建可以在Visual Studio项目中使用的实际静态库(.lib)?
最佳答案
x264无法对BGR进行编码必须将图像转换为YUV 4:2:0p。我建议使用ffmpeg项目中的libswscale执行此操作。
编辑#2
不,startcode至少是两个0x00字节,后跟一个0x01但它可以有任意数量(但通常是两个或三个空字节)4字节版本用于检测串行传输中的字节对齐,通常在SPS和PPS NALUs之前。
关于c - X264编码器API,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23100282/