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 секунд.

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


person John    schedule 16.11.2016    source источник


Ответы (1)


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

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

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

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

CMTimeMakeWithSeconds(1, 600)
person Rhythmic Fistman    schedule 17.11.2016