top*_*une 10 openal objective-c avfoundation ios
我正在制作一个简单的视频编辑应用程序.我想为我的应用添加慢动作.我注意到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)];
}
Run Code Online (Sandbox Code Playgroud)
谁能给我一些关于这个问题的建议?谢谢!
小智 5
为了能够用声音播放慢动作,只需为AVPlayerItem设置适当的audioTimePitchAlgorithm
playerItem.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmVarispeed;
Run Code Online (Sandbox Code Playgroud)
由于 Apple api 中的错误(错误 ID:14616144),ScaleTimeRange 不适用于音频。然而,可以使用重采样来完成时间缩放音频。如果音频以 48 kHz 采样,则重新采样到 96 kHz 并以 48 kHz 播放音频,这将需要两倍的播放时间。一般来说:
scaledSampleRate = (orignalSampleRate / playRate);
playRate = (originalSampleRate / scaledSampleRate);
Run Code Online (Sandbox Code Playgroud)
如果不希望的话,音高将会降低。解决方案可能是第三方 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];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1884 次 |
| 最近记录: |