2012-01-08 2 views
3

동영상을 사진 앨범에 저장하는 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]; 

답변

2

첫 번째 PTS는 첫 번째 PTS 제로, 0/24 폭격기가 아니라 1/24S

아차, 죄송 내 실수이어야한다 - 나는 알아 차리지 않았다 CVPixelBufferPoolCreatePixelBufferappendPixelBuffer:withPresentationTime:, 그래서 그 내 대답이 바뀌 었어.

추가하는 첫 번째 픽셀 버퍼는 이미지 배열과 아무 관련이 없습니다. 정의되지 않았습니까? 나는 그것이 초록색이라고 생각한다. 픽셀 버퍼 풀로 무엇을하고 있는지 잘 모르겠습니다. 두 줄을 지우고 루프를 0으로 리베이스하면 녹색 프레임을 제거해야합니다.

+0

이 : CMTime frameTime = CMTimeMake (1,24); 은 다음과 같아야합니다. 첫 번째 루프의 CMTimeMake (0,24)? 시도했지만 영화를 만들지 않습니다. 나는 당신을 오해하고 있습니까? – Henrietta

+2

아, 맞습니다. 첫 번째 appendPixelBuffer가 삭제되고 녹색 프레임이 사라집니다. 고맙습니다!! – Henrietta

+0

@Henrietta 안녕하세요, 앱 화면에서 녹화하는 동안 동일한 문제가 발생하지만 녹색 줄이 비디오를 통해 표시됩니다. 어떻게 해결할 수 있습니까? – Raj

관련 문제