이미지 인코딩 용 X264 API를 연구 중입니다.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);
EDIT # 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
× 00 × 00 × 00은 0x01로 시작하는데, 각 NAL 유닛 아닌가?
szatmary : 귀하의 소중한 의견에 진심으로 감사드립니다. 따라서 각 NAL 단위가 반드시 0,0,0,1로 시작할 필요는 없다고 말하는 것입니다. 그러나 나는 당신의 대답에 대해 조금 분명하지 않습니다. 특정 구성에서 NAL 단위 은이 0,0,0,1로 시작 함을 의미합니까? 그렇다면 어떤 구성입니까? 네트워크에서 원격 수신기로 전송하는 각 NAL 장치가 0,0,0,1로 시작하는지 확인해야합니다. x264 라이브러리를 탐색하기 전에 x264 exe 및 파이프 된 BMP 데이터를 사용하고 x264 프로세스에서 인코딩 된 데이터를 사용했습니다. 그런 다음 인코더 출력을 구문 분석하고 0,0,0,1을 찾아 NAL 단위를 찾았습니다. x264 라이브러리에서 어떻게 동일한 작업을 수행합니까? libswscale에 관한
는 :
는 내가는 FFmpeg 소스를 다운로드하여 구성하고는 MinGW에서 확인 달렸다. 프로세스가 완료된 후에는 여러 개의 .exe 파일을 찾을 수 없었습니다. Visual Studio 프로젝트에서 사용할 수있는 실제 정적 라이브러리 (.lib)를 어떻게 빌드합니까?
x264.exe가 원시 BGR 또는 RGB 비트 맵 데이터를 입력으로 가져올 수 있다고 어떻게 설명합니까? 그리고 x264 매개 변수 'X264_CSP_BGR'은 어떻습니까? 그럼 그게 뭐야? – user1884325
내 게시물을 편집하고 추가 질문을 추가했습니다. – user1884325
x264 실행 파일은 추가 기능을 추가합니다. 스케일링을 위해 ffmpeg에서 libswscale을 사용합니다. (소스를 살펴보십시오) – szatmary