2016-11-16 51 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)