6

我正在通过AVMutableVideoCompositionLayerInstructioniOS7 SDK 修改一些视频。

以下代码用于 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属性,exportSession则可以,但我不能应用任何转换。有谁知道这可能是什么原因造成的?

谢谢。

4

2 回答 2

1

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

为了增加混淆级别,asset还可以有一个AVComposition. 我认为AVFoundation团队在命名这些东西时没有做得最好......

于 2013-11-13T19:11:24.307 回答
1

我一直在努力使用 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. 
  }];

希望这对任何有同样问题的人有所帮助。

于 2014-02-17T09:30:12.937 回答