2013-09-29 91 views
5

我正在通过iOS7 SDK中的AVMutableVideoCompositionLayerInstruction修改某些视频。iOS7 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属性则视频记录好,但我不应用任何转换。任何人都知道可能是由什么造成的?

谢谢。

+0

同样在这里,没有在互联网上的帮助 –

回答

0

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

为了增加混淆程度,asset也可以有AVComposition。我认为AVFoundation团队在命名这些东西时并没有做出最好的工作......

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

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