【问题标题】:iOS7 AVMutableVideoCompositionLayerInstruction causes video frame to freezeiOS7 AVMutableVideoCompositionLayerInstruction 导致视频帧冻结
【发布时间】:2013-09-29 21:26:02
【问题描述】:

我正在通过 iOS7 SDK 中的AVMutableVideoCompositionLayerInstruction 修改一些视频。

以下代码用于在 iOS 6.1.3 上运行,但在 iOS7 中,视频在第一帧被冻结(尽管我仍然可以听到音频正常)。我摆脱了所有实际应用的转换,以验证单独添加视频合成会导致问题。

AVURLAsset* videoAsset = [[AVURLAsset alloc] initWithURL:inputFileURL options:NULL];
AVAssetTrack *videoAssetTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

AVMutableVideoCompositionLayerInstruction *layerInstruction =
[AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoAssetTrack];

AVMutableVideoComposition *mainComposition = [AVMutableVideoComposition videoComposition];
AVMutableVideoCompositionInstruction *mainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
mainInstruction.layerInstructions = [NSArray arrayWithObject:layerInstruction];
mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, videoAsset.duration);
mainComposition.instructions = [NSArray arrayWithObject:mainInstruction];
mainComposition.frameDuration = videoAsset.duration;
mainComposition.renderSize = CGSizeMake(320, 320);

...
exportSession.videoComposition = mainComposition;

如果我没有设置exportSessionvideoComposition 属性,那么视频录制正常,但我无法应用任何转换。有谁知道是什么原因造成的?

谢谢。

【问题讨论】:

  • 这里一样,网上没有帮助

标签: ios objective-c ios6 ios7


【解决方案1】:

调试视频合成问题的一个好方法是使用[AVMutableVideoComposition videoCompositionWithPropertiesOfAsset:asset]。返回的AVMutableVideoComposition 应该可以正常工作。然后您可以将instructions 数组的内容与您的指令进行比较。

为了增加混淆程度,asset 也可以是AVComposition。我认为AVFoundation 团队在命名这些东西时做得不是最好的......

【讨论】:

    【解决方案2】:

    我也一直在努力使用 AVMutableVideoCompositionLayerInstruction 并将视频与 CALayers 混合。经过几天尝试不同的方式后,我意识到资产的时间非常重要。 找出每个资产的时间的正确方法是使用属性:

    loadValuesAsynchronouslyForKeys:@[@"duration"]

        //Asset url
        NSURL *assetUrl = [NSURL fileURLWithPath:_firstVideoFilePath];
    
       //audio/video assets
       AVURLAsset * videoAsset = [[AVURLAsset alloc]initWithURL:assetUrl options:nil];
    
       //var to store the duration
       CMTime __block durationTime;
    
       //And here we'll be able to proper get the asset duration
       [videoAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler: ^{
             Float64 durationSeconds = CMTimeGetSeconds([videoAsset duration]);
             durationTime = [videoAsset duration];
             //At this point you have the proper asset duration value, you can start any video processing from here. 
      }];
    

    希望这对遇到同样问题的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-05-08
      • 1970-01-01
      • 2011-07-08
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多