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];
뷰는이 방법을 기록
pixelBuffer
은 CVPixelBufferRef
입니다.
framenumber
은 int64_t
입니다.
buffer
및 buffer2
은 GLubyte
입니다.
아무런 오류가 없지만 녹음을 마친 후 파일이 없습니다. 도움이나 도움을 얻을 수있는 링크가 있으면 크게 감사하겠습니다. OpenGL은 카메라의 라이브 피드를 사용합니다. 나는 화면을 UIImage
으로 저장할 수 있었지만 내가 만든 것을 영화로 만들고 싶습니다.
나는 RGBA 데이터를 메시징하고 있다고 생각하지만 잘못된 것일 수 있습니다. AVAssetWriterInputPixelBufferAdaptor를 사용하고 있습니다. 문제는 픽셀 버퍼 풀을 보내지 않는다는 것입니다. 나는 그 일을하는 법을 모른다. – SnowJack
AVAssetWriterInputPixelBufferAdaptor를 사용하는 경우 질문을 업데이트해야합니다. –