【问题标题】:iOS AVFoundation - Show a time display over a video and exportiOS AVFoundation - 在视频上显示时间并导出
【发布时间】:2011-06-12 13:50:03
【问题描述】:

我想在视频上显示叠加层并导出包含此显示的视频。我查看了 AVFoundation 框架、AVCompositions、AVAssets 等,但我仍然没有实现这一目标的想法。有一个名为 AVSynchronizedLayer 的类,它可以让你动画与视频同步的东西,但我不想动画,我只是想将时间显示覆盖到视频的每一帧中。有什么建议吗?

问候

【问题讨论】:

  • 我也想做同样的事情。你做到了吗?你能帮我看看如何根据亚当的回答更新“myClockLayer”。
  • 你有什么关于这个的吗???

标签: ios video overlay avfoundation


【解决方案1】:

我觉得可以用AVCaptureVideoDataOutput处理每一帧,用AVAssetWriter记录处理后的帧。可以参考这个答案

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

使用AVAssetWriterPixelBufferAdaptor的appendPixelBuffer:withPresentationTime:方法导出
我强烈建议使用 OpenCV 来处理帧。这是一个很好的教程

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

OpenCV 库非常棒。

【讨论】:

    【解决方案2】:

    这样的……

    (注意:从一个更大的项目中挑选出来,所以我可能无意中包含了一些不必要的部分)。

    您需要获取时钟/动画的 CALayer,并将其设置为 var myClockLayer(由 andimation 工具向下使用 1/3)。

    这还假设您的传入视频只有两个轨道 - 音频和视频。如果你有更多,你需要更仔细地在“asTrackID:2”中设置track 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){}];
    

    【讨论】:

    • 我想每秒更新我的文本层。我想在 expoerted 视频上显示日期时间,每秒更新一次。你能指导我怎么做吗?
    • 用你的问题在 StackOverflow 上创建一个新问题
    • 已经创建。这是链接stackoverflow.com/questions/14894324/…
    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多