AVAsset 不随时间正确切割

AVAsset is not cutting correct with time

我有这个代码:

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;

而不是第一行,它工作正常。但是第一部分的浮点值正好是10秒。

你能帮帮我吗?

您对 CMTimeRangeMake() 的调用在两个方面看起来很奇怪:

首先,您要从资产中移除 1 秒,因此您也应该将持续时间减少 1 秒:

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

其次,您对 CMTimeMakeWithSeconds 的那些调用中的 preferredTimescale 使用 NSEC_PER_SEC 看起来很可疑。 109 看起来有点大。为什么不试试 600 之类的东西呢?例如

CMTimeMakeWithSeconds(1, 600)