我正在研究用于编码图像的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/

10-09 22:45