2014-04-16 3 views
2

이미지 인코딩 용 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)를 어떻게 빌드합니까?

답변

1

x264는 BGR을 인코딩 할 수 없습니다. 이미지를 YUV 4 : 2 : 0p로 변환해야합니다. 이 작업을 수행하려면 ffmpeg 프로젝트에서 libswscale을 사용하는 것이 좋습니다.

EDIT # 2

아니하는 시작 코드는 0x01로 이어 적어도 두 × 00 바이트이다. 그러나 그것은 임의의 수를 가질 수 있습니다 (그러나 보통 2 또는 3 개의 널 바이트입니다). 4 바이트 버전은 직렬 전송에서 바이트 alighnemnt를 감지하는 데 사용되며 일반적으로 SPS 및 PPS NALUs 앞에옵니다.

+0

x264.exe가 원시 BGR 또는 RGB 비트 맵 데이터를 입력으로 가져올 수 있다고 어떻게 설명합니까? 그리고 x264 매개 변수 'X264_CSP_BGR'은 어떻습니까? 그럼 그게 뭐야? – user1884325

+0

내 게시물을 편집하고 추가 질문을 추가했습니다. – user1884325

+0

x264 실행 파일은 추가 기능을 추가합니다. 스케일링을 위해 ffmpeg에서 libswscale을 사용합니다. (소스를 살펴보십시오) – szatmary