동영상을 사진 앨범에 저장하는 iPhone 앱을 마무리합니다. 동영상 원본은 이미지 배열입니다. 나는 영화를 만들었고 그것들을 사진 앨범에 아주 멋지게 넣었지만 처음에는 항상 초록색 프레임이 추가되었습니다.AVAssetWriter가 녹색 프레임을 동영상 출력에 추가합니다.
아이디어가 있으십니까?
전 애플에서 문서를 다시 읽었고 전선을 흔들 거리며 번호가 매겨진 이미지로 몇 가지 테스트를 수행하여 프레임이나 그런 것들이 떨어지지 않았는지 확인했습니다. 여전히 올바른 방법으로 그것을 얻지 못합니다.
//build save path with time
NSMutableString *buildPath = [[NSMutableString alloc] init];
[buildPath setString:@"Documents/"];
[buildPath appendString:@"temporary.mp4"];
NSString *fullPath = [NSHomeDirectory() stringByAppendingPathComponent:buildPath];
[buildPath release];
//if the file already exists, deleate it
NSFileManager *fileMgr = [NSFileManager defaultManager];
if([fileMgr fileExistsAtPath:fullPath]){
if([fileMgr removeItemAtPath:fullPath error:&error] != YES){
//error
}
}
//prepare to write the movie
AVAssetWriter *videoWriter =
[[AVAssetWriter alloc] initWithURL
:[NSURL fileURLWithPath:fullPath]
fileType:AVFileTypeMPEG4
error:&error];
NSParameterAssert(videoWriter);
NSDictionary *videoSettings =
[NSDictionary dictionaryWithObjectsAndKeys:
AVVideoCodecH264,AVVideoCodecKey,
[NSNumber numberWithInt:width],AVVideoWidthKey,
[NSNumber numberWithInt:height],AVVideoHeightKey,
nil];
AVAssetWriterInput* writerInput =
[[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings]
retain];
AVAssetWriterInputPixelBufferAdaptor *adaptor =
[AVAssetWriterInputPixelBufferAdaptor
assetWriterInputPixelBufferAdaptorWithAssetWriterInput
:writerInput sourcePixelBufferAttributes
:nil];
NSParameterAssert(writerInput);
NSParameterAssert([videoWriter canAddInput:writerInput]);
[videoWriter addInput:writerInput];
//start writing
[videoWriter startWriting];
[videoWriter startSessionAtSourceTime:kCMTimeZero];
CVPixelBufferRef buffer = NULL;
buffer = [self pixelBufferFromCGImage
:[[imageArray objectAtIndex:0] CGImage]
:CGSizeMake(width,height)];
CVPixelBufferPoolCreatePixelBuffer(NULL,adaptor.pixelBufferPool,&buffer);
[adaptor appendPixelBuffer:buffer withPresentationTime:kCMTimeZero];
//loop through image array
int y = [imageArray count];
int x = 0;
while(x < y)
{
if(writerInput.readyForMoreMediaData == YES){
CMTime frameTime = CMTimeMake(1,24);
CMTime lastTime = CMTimeMake(x,24);
CMTime presentTime = CMTimeAdd(lastTime,frameTime);
buffer = [self pixelBufferFromCGImage
:[[imageArray objectAtIndex:x] CGImage]
:CGSizeMake(width,height)];
[adaptor appendPixelBuffer:buffer
withPresentationTime:presentTime];
x++;
}
}
//finish writing
[writerInput markAsFinished];
[videoWriter finishWriting];
//clean up
CVPixelBufferPoolRelease(adaptor.pixelBufferPool);
[videoWriter release];
[writerInput release];
//handle after save, save is asynchronous
void(^completionBlock)(NSURL *, NSError *) =
^(NSURL *assetURL, NSError *error)
{
if(error != nil){
//error
}
//remove temp movie file
if([fileMgr removeItemAtPath:fullPath error:&error] != YES){
//error
}
};
//write the movie to photo album
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
NSURL *filePathURL = [NSURL fileURLWithPath:fullPath isDirectory:NO];
if([library videoAtPathIsCompatibleWithSavedPhotosAlbum:filePathURL]){
[library
writeVideoAtPathToSavedPhotosAlbum:filePathURL
completionBlock:completionBlock];
}
//clean up
[library release];
이 : CMTime frameTime = CMTimeMake (1,24); 은 다음과 같아야합니다. 첫 번째 루프의 CMTimeMake (0,24)? 시도했지만 영화를 만들지 않습니다. 나는 당신을 오해하고 있습니까? – Henrietta
아, 맞습니다. 첫 번째 appendPixelBuffer가 삭제되고 녹색 프레임이 사라집니다. 고맙습니다!! – Henrietta
@Henrietta 안녕하세요, 앱 화면에서 녹화하는 동안 동일한 문제가 발생하지만 녹색 줄이 비디오를 통해 표시됩니다. 어떻게 해결할 수 있습니까? – Raj