2016-11-16 9 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]; 

     } 

Это не работает. Странная вещь: Если я использую:

float seconds = 10; 

Вместо первой строки он отлично работает. Но значение float в первой части равно ровно 10 секундам.

Вы можете мне помочь?

ответ

1

Ваши звонки на CMTimeRangeMake() выглядеть странно двумя способами:

Во-первых, вы удаляете 1 секунду от актива, так что вы должны сократить длительность на 1 секунду тоже:

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

Во-вторых, ваше использование NSEC_PER_SEC для preferredTimescale этих звонков на CMTimeMakeWithSeconds выглядит подозрительно. 10 похоже видa большой. Почему бы не попробовать с чем-то вроде 600? например

CMTimeMakeWithSeconds(1, 600)