美文网首页iOS视频开发iOS开发资料收集区iOS音视频
iOS:AvPlayer设置播放速度不生效的解决办法

iOS:AvPlayer设置播放速度不生效的解决办法

作者: hu9134 | 来源:发表于2016-12-08 11:14 被阅读4036次

现象:

项目有一个需求是实现视频的慢速播放,使用的是封装的AvPlayer,但是设置时发现比如设置rate为0.5,0.1,0.01都是一样的速度,非常疑惑.后来经过查找资料,发现iOS
10对这个API进行了更新

iOS10之前官方API对AvPlayer rate属性的解释是
/*! 
@property  rate
@abstract  Changes the playback rate of the input signal
@discussion   A value of 2.0 results in the output audio playing one octave higher.A value of 0.5, results in the output audio playing one octave lower.
Range: 0.5 -> 2.0
Default: 1.0
Mixer: AVAudioEnvironmentNode
*/

由上,我们可以发现这个rate只是支持0.5-2倍的

iOS10更新后对AvPlayer rate属性的解释是
/*!
 @property  rate
 @abstract  Indicates the desired rate of playback; 0.0 means "paused", 1.0 indicates a desire to play at the natural rate of the current item.
 @discussion
 Setting the value of rate to 0.0 pauses playback, causing the value of timeControlStatus to change to AVPlayerTimeControlStatusPaused.
 Setting the rate to a non-zero value causes the value of timeControlStatus to become either AVPlayerTimeControlStatusWaitingToPlayAtSpecifiedRate or AVPlayerTimeControlStatusPlaying, depending on whether sufficient media data has been buffered for playback to occur and whether the player's default behavior of waiting in order to minimize stalling is permitted. See discussion of AVPlayerTimeControlStatus for more details.
 
 AVPlayer can reset the desired rate to 0.0 when a change in overall state requires playback to be halted, such as when an interruption occurs on iOS, as announced by AVAudioSession, or when the playback buffer becomes empty and playback stalls while automaticallyWaitsToMinimizeStalling is NO.

 The effective rate of playback may differ from the desired rate even while timeControlStatus is AVPlayerTimeControlStatusPlaying, if the processing algorithm in use for managing audio pitch requires quantization of playback rate. For information about quantization of rates for audio processing, see AVAudioProcessingSettings.h. You can always obtain the effective rate of playback from the currentItem's timebase; see the timebase property of AVPlayerItem.
 */

在代码中设置小于0.5的值一直不生效,查找资料,好像只是支持

I actually had a ticket with Apple DTS open for this issue and a bug filed. The only supported values are 0.50, 0.67, 0.80, 1.0, 1.25, 1.50, and 2.0. All other settings are rounded to nearest value.

详见 解决办法

这里面有人提供了这样一种办法:

I found that smaller values are indeed supported, but all tracks in the AVPlayerItem have to support the speed. However, Apple does not provide a property on individual tracks that would indicate what rates are supported, there is only the property canPlaySlowForward on AVPlayerItem.

What i found is, that AVPlayerItems with an audio track cannot play at rates slower than 0.5. However, if there is only a video track, the rate can have an arbitrary small value like 0.01. I will try to write a category that checks on-the-fly which values are supported and disable unsupported tracks if needed.


//I wrote a function which you can call whenever you want to set the rate for video below 0.5. It enables/disables all audio tracks.
- (void)enableAudioTracks:(BOOL)enable inPlayerItem:(AVPlayerItem*)playerItem
{
    for (AVPlayerItemTrack *track in playerItem.tracks)
    {
        if ([track.assetTrack.mediaType isEqual:AVMediaTypeAudio])
        {
            track.enabled = enable;
        }
    }
}

我使用此方法解决了我的问题,非常感谢!!!!!特此记录,备忘!

相关文章

网友评论

  • FR_Zhang:这个倍速播放,比如我想设置0.25倍速,是不是必须要将声音audioEnable传入为NO
  • AndrewChang:请问我在.5倍速度播放音频时,有回声,应该怎么处理啊
  • 0胡杨0:我用怎么不好用,还是.5倍速
    hu9134:http://stackoverflow.com/questions/6630356/avplayer-rate-property-does-not-work 你可以看下这篇文章,这里面还有另外一种方法,可以试一下
    hu9134:@hu9134
    14
    down vote
    The play rate restriction appears to be due to pitch correction, which is now configurable in iOS 7 or later.

    // This prevents the play rate from going below 1/2.
    playerItem.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmLowQualityZeroLatency;
    That seems to be the default setting:

    Low quality and very low computationally intensive pitch algorithm. Suitable for brief fast-forward and rewind effects as well as low quality voice. The rate is snapped to {0.5, 0.666667, 0.8, 1.0, 1.25, 1.5, 2.0}.
    The other three algorithm settings let you vary the play rate down to 1/32. For example, AVAudioTimePitchAlgorithmVarispeed turns off pitch correction.

    // Enable play rates down to 1/32.
    playerItem.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmVarispeed;
    hu9134:@0胡杨0 我这可以的,设置低速率之前,先调用这个方法,我之前看到系统提供了一个方法,是设置声音与视频的关系的,那个应该也可以,我找一下
  • Jack问:求代码参考一下
    hu9134:@问天an_yan 代码就是文章最后面那个方法,想要设置速率的时候调用一下这个方法,传NO,就可以了。正常播放下,记得置为YES

本文标题:iOS:AvPlayer设置播放速度不生效的解决办法

本文链接:https://www.haomeiwen.com/subject/rttsmttx.html