2013-02-12 6 views
1

libav를 사용하여 RGB 이미지 데이터 (.png 이미지에서 파생 됨)의 벡터를 YUV420p 형식으로 변환하려고합니다. , 첫째libav를 사용하여 rgb에서 yuv420p로 인코딩

나는 RGB를 재 배열해야합니까 : 여기 몇 가지에 대해 명확하지 않다

/* prepare a dummy image */ 
static void fill_yuv_image(AVFrame *pict, int frame_index, int width, int height) 
{ 
    int x, y, i; 

    i = frame_index; 

    /* Y */ 
    for(y=0;y<height;y++) { 
     for(x=0;x<width;x++) { 
      pict->data[0][y * pict->linesize[0] + x] = x + y + i * 3; 
     } 
    } 

    /* Cb and Cr */ 
    for(y=0;y<height/2;y++) { 
     for(x=0;x<width/2;x++) { 
      pict->data[1][y * pict->linesize[1] + x] = 128 + y + i * 2; 
      pict->data[2][y * pict->linesize[2] + x] = 64 + x + i * 5; 
     } 
    } 
} 

: 다음은 libav 샘플 코드에서

는 더미 이미지를 만드는 데 사용됩니다 입력 벡터의 데이터를 YUV420p로 인코딩하는 데 적합합니까?

두 번째로 모든 픽셀에 대해 Y 값이 있고 Cb 및 Cr 값이 4x2 픽셀에 사용됨을 이해합니다. 내가 이해할 수없는 것은 RGB 데이터가 Cb 및 Cr 값으로 "감소"되는 방식입니다.이 방법을 어디서나 수행 할 수있는 방법이 있습니까?

답변

0

난 당신이 정확히 무엇을 달성하고 싶은지 완전히 확실하지 않다, 그래서 난 그냥 직접 내가 (명확히 의견 후속 부담) 할 수 최고로 질문에 답변 해 드리겠습니다 :

1) 당신은 RGB 데이터를 YUV로 변환하여 일부 재배치가 포함됩니다. 압축 된 RGB 데이터는 괜찮습니다. 당신은 정말로 그것을 조정할 필요가 없습니다. 실제로, 캐시 지역성을 이유로 포장 된 상태로 두는 것이 더 나을 것입니다.

2) 이미 알고 있듯이 YUV 4 : 2 : 0은 각 픽셀에 대해 Y 샘플을 인코딩하지만 각 2x2 블록은 Cb 및 Cr 값을 공유합니다. 그러나 YUV 4 : 4 : 4 데이터도 있습니다. 이것은 각 픽셀이 자체 Y, Cb 및 Cr 샘플을 얻는 곳입니다. RGB → YUV 4 : 2 : 0 변환에 대한 간단한 전략은 RGB → YUV 4 : 4 : 4로 변환 한 다음 2x2 Cb 샘플의 각 블록을 평균 (산술 평균)하는 것입니다. 주변의 샘플을 더 많이 포함하는 필터와 같은 다른 알고리즘이 있지만이 방법의 작동 방식을 실험하고 있다면이 방법이 효과적입니다.

실험 (및 속도)에 대한 또 다른 전략은 Y 평면을 계산하고 Cb 및 Cr 평면을 128로 일정하게 유지하는 것입니다. 그러면 그레이 스케일 이미지가 생성됩니다.

실제 작업을 위해서는 libav가 제공해야하는 내장 변환 기능을 활용하고 싶을 것입니다.

+0

먼저 답장을 보내 주셔서 감사합니다. 저는 OS 애니메이션 프로그램 인 Pencil2D에서 일하고 있습니다. 지금 나는 파일 내보내기 작업을 시도하고있다. 테스트로 하나의 이미지 (예 : 2 초의 정적 이미지)를 사용하여 동영상 파일을 인코딩하려고했습니다. – user2063909