2010-03-07 2 views
2

코어 표면 RGB 프레임 버퍼 (Iphone)를 ffmpeg Avfarme로 변환하여 동영상 파일로 인코딩하려고합니다. 하지만 정확한 비디오 출력 (올바른 그림이 아니라 눈부신 색상을 보여주는 비디오)을 얻지 못합니다.Iphone 코어 표면 RGB 프레임에서 ffmepg로 변환 AVFarme

코어 표면 프레임 버퍼를 AVFrame으로 변환하는 데 문제가있는 것 같군요.

Surface *surface = [[Surface alloc]initWithCoreSurfaceBuffer:coreSurfaceBuffer]; 
[surface lock]; 
unsigned int height = surface.height; 
unsigned int width = surface.width; 
unsigned int alignmentedBytesPerRow = (width * 4); 
if (!readblePixels) { 
    readblePixels = CGBitmapAllocateData(alignmentedBytesPerRow * height); 
    NSLog(@"alloced readablepixels"); 
} 
unsigned int bytesPerRow = surface.bytesPerRow; 
void *pixels = surface.baseAddress; 
for (unsigned int j = 0; j < height; j++) { 
    memcpy(readblePixels + alignmentedBytesPerRow * j, pixels + bytesPerRow * j, bytesPerRow); 
} 

pFrameRGB->data[0] = readblePixels; // I guess here is what I am doing wrong. 
pFrameRGB->data[1] = NULL; 
pFrameRGB->data[2] = NULL; 
pFrameRGB->data[3] = NULL; 

pFrameRGB->linesize[0] = pCodecCtx->width; 
pFrameRGB->linesize[1] = 0; 
pFrameRGB->linesize[2] = 0; 
pFrameRGB->linesize[3] = 0; 


sws_scale (img_convert_ctx, pFrameRGB->data, pFrameRGB->linesize, 
     0, pCodecCtx->height, 
     pFrameYUV->data, pFrameYUV->linesize); 

나 좀 도와주십시오

여기 내 코드입니다.

감사합니다,

라구이 문제를 해결할 수

+1

'Surface'는 비공개 API이며이 앱이 그 이유로 인해 스토어에서 허용되지 않는다는 것을 알고 계십니까? –

+2

내가 잘못하지 않았다면, 모든 사람들이 dlopen()과 dlsym()으로 동적 호출을 사용하는 코어 표면을 사용하고 있습니다. 사과는 그 사람들 앱을 수락하는 것처럼 보입니다. –

답변

3

는 :

pFrameRGB->linesize[0] = pCodecCtx->width * 4; // linesize includes total bytes for the line (ARGB) 

청춘의 시간을 낭비하지만, 당신은 St3fan 제안으로 표면을 사용 안된다. 앱이 거부됩니다.

+0

사람들이 사과 표면에서 dlopen()과 dlsym()을 사용하여 코어 표면을 사용한다고 생각합니다. –

+0

예 폭을 사용하여 문제를 해결했으며 * RGB24를 RGB32로 변경해야했습니다. 이제는 잘 작동합니다. –

+0

카메라에서 원시 스트림을 얻는 유효한 방법을 알고 있습니까? –