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)
我有这个代码:
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)