iOS7 AVMutableVideoCompositionLayerInstruction导致视频帧冻结

时间:2013-09-29 21:26:03

标签: ios objective-c ios6 ios7

我正在通过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;

如果我没有设置videoComposition的{​​{1}}属性,那么视频记录正常,但我无法应用任何转换。任何人都知道可能导致这种情况的原因吗?

感谢。

2 个答案:

答案 0 :(得分:1)

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

  

loadValuesAsynchronouslyForKeys:@ [@ “持续时间”]

    //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. 
  }];

希望这有助于遇到同样问题的任何人。

答案 1 :(得分:0)

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

为了增加混淆程度,asset也可能有AVComposition。我认为AVFoundation团队在命名这些事情时并没有做到最好......