2011-11-10 2 views
0

AVAssetWriter을 생성하여 OpenGL 프로젝트 캡처를 시도하고 있습니다. AVAssetWriter 또는 AVAssetWriterInputPixelBufferAdaptor를 작성한 적이 없어서 올바르게 수행했는지 확신 할 수 없습니다. 클래스의AVAssetWriterInputPixelBufferAdaptor에 대한 OpenGL보기 캡처

- (id) initWithOutputFileURL:(NSURL *)anOutputFileURL { 
    if ((self = [super init])) { 
     NSError *error; 
     movieWriter = [[AVAssetWriter alloc] initWithURL:anOutputFileURL fileType:AVFileTypeMPEG4 error:&error]; 
     NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
             AVVideoCodecH264, AVVideoCodecKey, 
             [NSNumber numberWithInt:640], AVVideoWidthKey, 
             [NSNumber numberWithInt:480], AVVideoHeightKey, 
             nil]; 
     writerInput = [[AVAssetWriterInput 
         assetWriterInputWithMediaType:AVMediaTypeVideo 
         outputSettings:videoSettings] retain]; 
     writer = [[AVAssetWriterInputPixelBufferAdaptor alloc] initWithAssetWriterInput:writerInput sourcePixelBufferAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey,nil]]; 

     [movieWriter addInput:writerInput]; 
     writerInput.expectsMediaDataInRealTime = YES; 
    } 

    return self; 
} 

다른 부분 다음 assetwriter에 의해 시작

- (void)getFrame:(CVPixelBufferRef)SampleBuffer:(int64_t)frame{ 
    frameNumber = frame; 
    [writer appendPixelBuffer:SampleBuffer withPresentationTime:CMTimeMake(frame, 24)]; 
} 

- (void)startRecording { 
    [movieWriter startWriting]; 
    [movieWriter startSessionAtSourceTime:kCMTimeZero]; 
} 

- (void)stopRecording { 
    [writerInput markAsFinished]; 
    [movieWriter endSessionAtSourceTime:CMTimeMake(frameNumber, 24)]; 
    [movieWriter finishWriting]; 
} 

:

glReadPixels(0, 0, 480, 320, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 
    for(int y = 0; y <320; y++) { 
    for(int x = 0; x <480 * 4; x++) { 
     int b2 = ((320 - 1 - y) * 480 * 4 + x); 
     int b1 = (y * 4 * 480 + x); 
     buffer2[b2] = buffer[b1]; 
    } 
}  
pixelBuffer = NULL; 
CVPixelBufferCreateWithBytes (NULL,480,320,kCVPixelFormatType_32BGRA,buffer2,1920,NULL,0,NULL,&pixelBuffer); 
[recorder getFrame:pixelBuffer :framenumber]; 
    framenumber++; 

참고 :

NSURL *outputFileURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"]]; 
    recorder = [[GLRecorder alloc] initWithOutputFileURL:outputFileURL]; 

뷰는이 방법을 기록

pixelBufferCVPixelBufferRef입니다.
framenumberint64_t입니다.
bufferbuffer2GLubyte입니다.

아무런 오류가 없지만 녹음을 마친 후 파일이 없습니다. 도움이나 도움을 얻을 수있는 링크가 있으면 크게 감사하겠습니다. OpenGL은 카메라의 라이브 피드를 사용합니다. 나는 화면을 UIImage으로 저장할 수 있었지만 내가 만든 것을 영화로 만들고 싶습니다.

답변

0

RGBA 프레임을 작성하는 경우 AVAssetWriterInputPixelBufferAdaptor을 사용해야 할 수도 있습니다. 이 클래스는 픽셀 버퍼 풀을 관리하기로되어 있지만 실제로 데이터를 YUV로 마사지한다는 인상을받습니다.

그럴 경우 색상이 모두 바뀌었을 때 픽셀 쉐이더를 써서 BGRA로 변환해야 할 것입니다. 아니면 (떨리는) CPU에서해라. 너까지.

+0

나는 RGBA 데이터를 메시징하고 ​​있다고 생각하지만 잘못된 것일 수 있습니다. AVAssetWriterInputPixelBufferAdaptor를 사용하고 있습니다. 문제는 픽셀 버퍼 풀을 보내지 않는다는 것입니다. 나는 그 일을하는 법을 모른다. – SnowJack

+0

AVAssetWriterInputPixelBufferAdaptor를 사용하는 경우 질문을 업데이트해야합니다. –

0

대답을 찾았습니다 : Saving to library 나는 비디오를 carmera 롤에 저장하지 않았습니다.

카메라 롤에서 생성 된 파일의 이름을 변경하는 데 시간을 사용하여 끊임없이 파일을 저장하거나 동일한 파일을 반복해서 저장하지 않아야했습니다.