2011-01-20 3 views
8

비디오 위에 디스플레이 오버레이를 표시하고이 디스플레이를 포함하여 해당 비디오를 내보내려고합니다. 나는 AVFoundation Framework, AVCompositions, AVAssets 등을 들여다 보았다. 그러나 나는 아직도 이것을 성취 할 아이디어가 없다. AVSynchronizedLayer라는 클래스가있어 동영상과 동기를 부여 할 수 있지만 애니메이션을 적용하지 않으려는 경우 동영상의 모든 프레임에 시간 표시를 오버레이합니다. 어떤 충고? 이 같은iOS AVFoundation - 비디오 및 시간 표시 위에 시간 표시

+0

동일한 일을하고 싶습니다.이 작업을 수행 했습니까? Adam의 대답에 따라 "myClockLayer"를 어떻게 업데이트 할 수 있는지 알려주세요. – Nikunj

+0

당신은 이것에 관해 무엇이라도 얻었 느냐? –

답변

5

뭔가

감사합니다 ...

(NB가 : 훨씬 더 큰 프로젝트에서 발췌, 그래서 실수로 불필요한 부분을 포함했을 수 있습니다).

시계/애니메이션의 CALayer를 가져와 var myClockLayer (설정 도구로 1/3 정도 사용)로 설정해야합니다.

여기에는 들어오는 비디오에 오디오와 비디오의 두 트랙 만 있다고 가정합니다. 더 많은 정보가 있으면 "asTrackID : 2"에서 트랙 ID를보다 신중하게 설정해야합니다.

AVURLAsset* url = [AVURLAsset URLAssetWithURL:incomingVideo options:nil]; 
AVMutableComposition *videoComposition = [AVMutableComposition composition]; 

AVMutableCompositionTrack *compositionVideoTrack = [videoComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
AVAssetTrack *clipVideoTrack = [[url tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [url duration]) ofTrack:clipVideoTrack atTime:kCMTimeZero error:&error]; 

AVMutableVideoComposition* videoComposition = [[AVMutableVideoComposition videoComposition]retain]; 
videoComposition.renderSize = CGSizeMake(320, 240); 
videoComposition.frameDuration = CMTimeMake(1, 30); 
videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithAdditionalLayer:myClockLayer asTrackID:2]; 

AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30)); 

AVMutableVideoCompositionLayerInstruction* layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack]; 
instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction]; 

videoComposition.instructions = [NSArray arrayWithObject: instruction]; 

exporter = [[AVAssetExportSession alloc] initWithAsset:saveComposition presetName:AVAssetExportPresetHighestQuality] ; 
exporter.videoComposition = videoComposition; 
exporter.outputURL=url3; 
exporter.outputFileType=AVFileTypeQuickTimeMovie; 

[exporter exportAsynchronouslyWithCompletionHandler:^(void){}]; 
+0

각 초마다 내 textlayer를 업데이트하고 싶습니다. 각 초마다 업데이트 된 동영상으로 날짜를 표시하고 싶습니다. 어떻게 할 수 있습니까? – Nikunj

+0

문제가 – Adam

+0

인 StackOverflow에 대한 새 질문을 만듭니다. http://stackoverflow.com/questions/14894324/add-date-and-time-on-recorded-video 링크입니다. – Nikunj

2

는 당신이 각 프레임을 처리하기 위해 AVCaptureVideoDataOutput를 사용하여이 대답

https://stackoverflow.com/a/4944594/379941을 참조 할 수 있습니다 처리 frame.You을 기록 AVAssetWriter를 사용할 수 있다고 생각합니다.

사용 AVAssetWriterPixelBufferAdaptor의 appendPixelBuffer : withPresentationTime : 방법은
을 수출하고 난 강력하게 프레임을 처리하기 위해 OpenCV의를 사용하는 것이 좋습니다. 좋은 튜토리얼입니다.

http://aptogo.co.uk/2011/09/opencv-framework-for-ios/.

OpenCV 라이브러리는 매우 훌륭합니다.