Свойство оценки AVPlayer не работает?
Так что может показаться, что единственные значения, которые на самом деле работают, это 0,0, 0,5, 1,0 и 2,0...
я попытался установить его на 0,25, так как я хочу, чтобы он играл на 1/4 от естественной скорости, но вместо этого он воспроизводил его на 1/2 от естественной скорости. Кто-нибудь может это подтвердить?
7 ответов
Подтверждено. У меня фактически был билет с Apple DTS, открытый для этой проблемы, и подана ошибка. Единственные поддерживаемые значения: 0,50, 0,67, 0,80, 1,0, 1,25, 1,50 и 2,0. Все остальные настройки округляются до ближайшего значения.
Ограничение скорости воспроизведения, по-видимому, связано с коррекцией основного тона, которая теперь настраивается в iOS 7 или более поздней версии.
// This prevents the play rate from going below 1/2.
playerItem.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmLowQualityZeroLatency;
Это похоже на настройку по умолчанию:
Низкое качество и очень низкий вычислительный алгоритм. Подходит для кратких эффектов быстрой перемотки вперед и назад, а также низкого качества голоса. Показатель привязан к {0,5, 0,666667, 0,8, 1,0, 1,25, 1,5, 2,0}.
Три другие настройки алгоритма позволяют вам снизить скорость воспроизведения до 1/32. Например, AVAudioTimePitchAlgorithmVarispeed
отключает коррекцию высоты тона.
// Enable play rates down to 1/32.
playerItem.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmVarispeed;
Я обнаружил, что меньшие значения действительно поддерживаются, но все дорожки в AVPlayerItem должны поддерживать скорость. Однако Apple не предоставляет свойство для отдельных дорожек, которое указывало бы, какие скорости поддерживаются, есть только свойство canPlaySlowForward для AVPlayerItem.
Я обнаружил, что AVPlayerItems со звуковой дорожкой не может воспроизводиться со скоростью ниже 0,5. Однако, если есть только видео дорожка, скорость может иметь произвольное небольшое значение, например 0,01. Я постараюсь написать категорию, которая на лету проверяет, какие значения поддерживаются, и при необходимости отключает неподдерживаемые треки.
бр денис
ОБНОВИТЬ
Я написал функцию, которую вы можете вызывать, когда хотите установить скорость для видео ниже 0,5. Включает / отключает все звуковые дорожки.
- (void)enableAudioTracks:(BOOL)enable inPlayerItem:(AVPlayerItem*)playerItem
{
for (AVPlayerItemTrack *track in playerItem.tracks)
{
if ([track.assetTrack.mediaType isEqual:AVMediaTypeAudio])
{
track.enabled = enable;
}
}
}
(Xcode 11.6, iOS 13.6, Swift 5)
Это не работает с
player.rate = 2.0
Работает с
player.playImmediately(atRate: 3.0)
Я согласен с @otto, привет ответ решил мою проблему.
/*
AVAudioProcessingSettings.h
@abstract Values for time pitch algorithm
@constant AVAudioTimePitchAlgorithmLowQualityZeroLatency
Low quality, very inexpensive. Suitable for brief fast-forward/rewind effects, low quality voice.
Rate snapped to {0.5, 0.666667, 0.8, 1.0, 1.25, 1.5, 2.0}.
@constant AVAudioTimePitchAlgorithmTimeDomain
Modest quality, less expensive. Suitable for voice.
Variable rate from 1/32 to 32.
@constant AVAudioTimePitchAlgorithmSpectral
Highest quality, most computationally expensive. Suitable for music.
Variable rate from 1/32 to 32.
@constant AVAudioTimePitchAlgorithmVarispeed
High quality, no pitch correction. Pitch varies with rate.
Variable rate from 1/32 to 32.
*/
AVF_EXPORT NSString *const AVAudioTimePitchAlgorithmLowQualityZeroLatency NS_AVAILABLE_IOS(7_0);
AVF_EXPORT NSString *const AVAudioTimePitchAlgorithmTimeDomain NS_AVAILABLE(10_9, 7_0);
AVF_EXPORT NSString *const AVAudioTimePitchAlgorithmSpectral NS_AVAILABLE(10_9, 7_0);
AVF_EXPORT NSString *const AVAudioTimePitchAlgorithmVarispeed NS_AVAILABLE(10_9, 7_0);
Нет, у меня это нормально работает ( xcode 4.2) на ipad 2 ios 5. Я использовал AVPlayerDemo из ресурсов dev и изменил свойство rate с помощью ползунка, и он очень плавный, определенно без скачков. хотя поведение ниже 0,2 странно. возможно, скорость не линейная вблизи экстремальных значений, но определенно плавная. от 0.2 до 2. Я использую видео, снятые на устройстве, которые могут изменить ситуацию.
До свидания,
джинсовый
Вы должны инициализировать player следующим образом;
player.enableRate = правда