【问题标题】:scaleTimeRange has no effect on audio type AVMutableCompositionTrackscaleTimeRange 对音频类型 AVMutableCompositionTrack 没有影响
【发布时间】:2013-06-20 14:36:56
【问题描述】:

我正在开发一个简单的视频编辑应用程序。我想在我的应用程序中添加慢动作。我注意到 AVMutableCompositionTrack 类中有一个 scaleTimeRange 方法,因此我使用它来实现我的目的。我发现 scaleTimeRange 在视频轨道上效果很好,但对音轨没有任何影响。这意味着音轨仍以原始速度播放。

以下是我的代码:

    CMTime insertionPoint = kCMTimeZero;

    double wholeDuration = CMTimeGetSeconds([asset duration]);
    double doubleDuration = CMTimeGetSeconds([asset duration])*2.0;
    CMTime trimmedDuration = CMTimeMakeWithSeconds(wholeDuration, 600.0);

    // Create a new composition
    self.mutableComposition = [AVMutableComposition composition];

    // Insert video and audio tracks from AVAsset
    if(assetVideoTrack != nil) {
        AVMutableCompositionTrack *compositionVideoTrack = [self.mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
        [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, trimmedDuration) ofTrack:assetVideoTrack atTime:insertionPoint error:&error];

        [compositionVideoTrack scaleTimeRange:CMTimeRangeMake(kCMTimeZero, trimmedDuration) toDuration:CMTimeMakeWithSeconds(doubleDuration, 600.0)];
    }
    if(assetAudioTrack != nil) {
        AVMutableCompositionTrack *compositionAudioTrack = [self.mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
        [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, trimmedDuration) ofTrack:assetAudioTrack atTime:insertionPoint error:&error];

        [compositionAudioTrack scaleTimeRange:CMTimeRangeMake(kCMTimeZero, trimmedDuration) toDuration:CMTimeMakeWithSeconds(doubleDuration, 600.0)];
    }

谁能给我一些关于这个问题的建议?谢谢!

【问题讨论】:

  • 您找到使用 scaletimeRange 减慢音频速度的解决方案了吗?我也遇到了同样的问题。?
  • 这里也一样,你找到解决办法了吗?
  • @dizy 我开始为这个问题提供赏金。让我们检查回复。 .

标签: ios objective-c avfoundation openal


【解决方案1】:

如果您正在使用 scaleTimeRange 并想知道为什么它不工作或无法播放任何音频,那么您可能应该将其添加到您的 playerItem。

playerItem.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithm.varispeed

【讨论】:

    【解决方案2】:

    为了能够播放带声音的慢动作,只需为 AVPlayerItem 设置适当的 audioTimePitchAlgorithm

    playerItem.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmVarispeed;
    

    【讨论】:

    • 感谢您帮我节省时间。最佳解决方案。
    【解决方案3】:

    由于苹果 api 中的错误(错误 ID:14616144),ScaleTimeRange 不适用于音频。但是,可以使用重采样来完成时间缩放音频。如果音频以 48 kHz 采样,则重新采样到 96 kHz 并以 48 kHz 播放音频,这将花费两倍的时间来播放。一般:

    scaledSampleRate = (orignalSampleRate / playRate);
    playRate = (originalSampleRate / scaledSampleRate);
    

    如果不希望这样做,音调会降低。解决方案可能是第三方 api。如果您可以将音频提取到单独的播放器,我想您可以使用 AVAudioPlayer,您可以在其中设置播放速率:

    player = [[AVAudioPlayer alloc] initWithContentsOfURL:
                      [NSURL fileURLWithPath:path] error:&err];
            player.volume = 0.4f;
            player.enableRate=YES;
            [player prepareToPlay];
            [player setNumberOfLoops:0];
            player.rate=2.0f;
            [player play];
    

    【讨论】:

      猜你喜欢
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2020-06-07
      相关资源
      最近更新 更多