简体   繁体   English

X264编码器API

[英]X264 Encoder API

I'm studying the X264 API for encoding images. 我正在研究用于编码图像的X264 API。

So far I've built the X264 library and the following code snippet shows how far I am: 到目前为止,我已经构建了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");
  }

So I'm trying to encode a 24bit BGR bitmap image. 因此,我正在尝试对24位BGR位图图像进行编码。 However, the x264 header file doesn't show any API function for writing the bitmap image to the encoder. 但是,x264头文件没有显示任何用于将位图图像写入编码器的API函数。 How is this done? 怎么做?

EDIT 编辑

This code snippet seems to work. 此代码段似乎有效。 I would appreciate a review and some comments. 我将不胜感激,并提出一些评论。 Thanks. 谢谢。

  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);

EDIT #2 The encoder outputs this: 编辑#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

Isn't each NAL unit supposed to start with 0x00 0x00 0x00 0x01 ? 不是每个NAL单元都以0x00 0x00 0x00 0x01开头吗?

szatmary : I appreciate your valuable feedback. szatmary :非常感谢您的宝贵意见。 So you're saying that each NAL unit does not necessarily start with 0,0,0,1. 因此,您说的是每个NAL单元不一定以0,0,0,1开头。 However, I'm a bit unclear on your answer. 但是,我对您的答案还不清楚。 Are you implying that with a certain configuration the NAL units will start with 0,0,0,1 ? 您是在暗示采用某种配置的NAL单位将以 0,0,0,1开头吗? If so, which configuration is that? 如果是这样,那是哪种配置? I need to make sure that each NAL unit I transmit out on the network to a remote receiver starts with 0,0,0,1. 我需要确保我在网络上传输到远程接收器的每个NAL单元都以0,0,0,1开头。 Prior to exploring the x264 library I was using the x264 exe and piped BMP data in and encoded data out from the x264 process. 在探索x264库之前,我使用过x264 exe,并通过管道将BMP数据输入到x264进程中,并从中编码出数据。 I then parsed the encoder output and looked for NAL units by looking for 0,0,0,1. 然后,我解析了编码器输出,并通过查找0,0,0,1来查找NAL单位。 How do I accomplish the same with the x264 library? 如何使用x264库完成相同的工作?

Regarding libswscale: 关于libswscale:

I downloaded the ffmpeg source and ran configure and make in MINGW. 我下载了ffmpeg源代码,并在MINGW中运行configure and make。 After the process had completed I couldn't find anything but a number of .exe files. 该过程完成后,我只能找到许多.exe文件。 How do I build actual static libraries (.lib) which I can use in a Visual Studio project? 如何构建可以在Visual Studio项目中使用的实际静态库(.lib)?

x264 can not encode BGR. x264无法编码BGR。 You must convert the image to YUV 4:2:0p. 您必须将图像转换为YUV 4:2:0p。 I recommend using libswscale from the ffmpeg project to perform this operation. 我建议使用ffmpeg项目中的libswscale来执行此操作。

EDIT #2 编辑#2

No, a startcode is at least two 0x00 bytes followed by a 0x01. 不,起始码至少是两个0x00字节,后跟一个0x01。 But it can have any number (But is usually two or three null bytes) The 4 byte version is used for detecting byte alighnemnt in serial transmissions and generally precedes SPS and PPS NALUs. 但是它可以有任意数量(但通常为两个或三个空字节)。4字节版本用于检测串行传输中的字节匹配,通常在SPS和PPS NALU之前。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM