2016-11-16 53 views
1

我有这样的代码:AVAsset不正确的切割与时间

float seconds = CMTimeGetSeconds(editableAsset.duration); 

     AVMutableComposition *thirtMutableComposition = [AVMutableComposition composition]; 

     if (assetVideoTrack != nil) { 
      AVMutableCompositionTrack *compositionVideoTrack = [thirtMutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
      AVAssetTrack *videoAssetTrack= [[editableAsset tracksWithMediaType:AVMediaTypeVideo] lastObject]; 
      compositionVideoTrack.preferredTransform = videoAssetTrack.preferredTransform; 
      [compositionVideoTrack insertTimeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(1, NSEC_PER_SEC), CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC)) ofTrack:assetVideoTrack atTime:kCMTimeZero error:nil]; 

     } 

     if (assetAudioTrack != nil) { 
      AVMutableCompositionTrack *compositionAudioTrack = [thirtMutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
      [compositionAudioTrack insertTimeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(1, NSEC_PER_SEC), CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC)) ofTrack:assetAudioTrack atTime:kCMTimeZero error:nil]; 

     } 

它不工作。奇怪的是:如果我使用:

​​3210

而不是第一行工作正常。但是第一部分的float值恰好是10秒。

你能帮我吗?

回答

1

您对CMTimeRangeMake()电话两种方式看起来很奇怪:

首先,你从资产中除去1秒,所以你应该1秒缩短持续时间过:

CMTimeRangeMake(CMTimeMakeWithSeconds(1, NSEC_PER_SEC), CMTimeMakeWithSeconds(seconds-1, NSEC_PER_SEC)) 

其次,您使用NSEC_PER_SECpreferredTimescale那些致电CMTimeMakeWithSeconds的电话看起来可疑。 10 似乎有点大。为什么不尝试使用类似600的东西呢?例如

CMTimeMakeWithSeconds(1, 600)