iOS AVFoundation - показывать время на видео и экспортировать - PullRequest
8 голосов
/ 20 января 2011

Я хочу показать наложение поверх видео и экспортировать это видео, включая этот дисплей. Я взглянул на AVFoundation Framework, AVCompositions, AVAssets и т. Д., Но у меня до сих пор нет идеи для достижения этой цели. Существует класс, называемый AVSynchronizedLayer, который позволяет анимировать вещи, синхронизированные с видео, но я не хочу анимировать, я просто хочу наложить отображение времени на каждый отдельный кадр видео. Любой совет?

Привет

Ответы [ 2 ]

5 голосов
/ 08 марта 2011

Примерно так ...

(Примечание: взято из гораздо более крупного проекта, поэтому я мог случайно включить некоторые ненужные фрагменты).

Вам нужно будет взятьCALayer ваших часов / анимации и установите его в переменную myClockLayer (используется 1/3 пути вниз инструментом анимации).

Это также предполагает, что ваше входящее видео имеет только две дорожки - аудио и видео.Если у вас есть больше, вам нужно более тщательно установить идентификатор дорожки в «asTrackID: 2».

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){}];
2 голосов
/ 06 марта 2012

Я думаю, вы можете использовать AVCaptureVideoDataOutput для обработки каждого кадра и использовать AVAssetWriter для записи обработанного кадра. Вы можете обратиться к этому ответу

https://stackoverflow.com/a/4944594/379941.

использование AVAssetWriterPixelBufferAdaptor's appendPixelBuffer: withPresentationTime: метод для экспорта
И я настоятельно рекомендую использовать OpenCV для обработки фрейма.это хороший учебник

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

Библиотека OpenCV очень хороша.

...