#iphone #objective-c #ipad #ipod
#iPhone #objective-c #iPad #ipod
Вопрос:
Я использую AVPlayer для воспроизведения моего видео с помощью ползунка и нескольких кнопок. Вот мои методы перемещения вперед и назад с помощью кнопок.
-(IBAction)MoveForward
{
//int value = timeSlider.value*36000 10;
//CMTime newTime = CMTimeMakeWithSeconds(value, playspeed);
//CMTime newTime = CMTimeMake(value,(playspeed*timeSlider.maximumValue));
CMTime newTime = CMTimeMakeWithSeconds(timeSlider.value, playspeed);
newTime.value = 60;
[player seekToTime: newTime];
}
-(IBAction)MoveBackward
{
CMTime newTime = CMTimeMakeWithSeconds(timeSlider.value-1, playspeed);
[player seekToTime: newTime];
}
Моя проблема в том, что время поиска не работает должным образом. Которые переходят к следующему кадру с учетом секунд. Мне нужно переместить следующий кадр с точностью до минуты. Помогите мне…
Ответ №1:
Я не совсем понимаю ваш код, вам действительно не нужны отдельные методы для перемещения вперед и назад, вы можете использовать один и тот же для обоих. У меня есть работающий видеопроигрыватель AVPlayer, я покажу вам, как я сделал часть слайдера.
-(IBAction)sliding:(id)sender {
CMTime newTime = CMTimeMakeWithSeconds(seeker.value, 1);
[self.player seekToTime:newTime];
}
-(void)setSlider {
sliderTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateSlider) userInfo:nil repeats:YES] retain];
self.seeker.maximumValue = [self durationInSeconds];
[seeker addTarget:self action:@selector(sliding:) forControlEvents:UIControlEventValueChanged];
seeker.minimumValue = 0.0;
seeker.continuous = YES;
}
- (void)updateSlider {
self.seeker.maximumValue = [self durationInSeconds];
self.seeker.value = [self currentTimeInSeconds];
}
- (Float64)durationInSeconds {
Float64 dur = CMTimeGetSeconds(duration);
return dur;
}
- (Float64)currentTimeInSeconds {
Float64 dur = CMTimeGetSeconds([self.player currentTime]);
return dur;
}
И это все, в этом коде есть две ошибки, во-первых, свойство duration возвращает переменную CMTime, вы должны преобразовать ее в значение с плавающей точкой, также это возвращает исходное количество секунд, вы должны преобразовать его в h: mm: ss, если вы хотите отображать метки времени. Во-вторых, метод updateSlider запускается по таймеру каждую секунду.
Удачи.
Ответ №2:
Следующий фрагмент кода сработал для меня:
CMTime videoLength = self.mPlayer.currentItem.asset.duration; // Gets the video duration
float videoLengthInSeconds = videoLength.value/videoLength.timescale; // Transfers the CMTime duration into seconds
[self.mPlayer seekToTime:CMTimeMakeWithSeconds(videoLengthInSeconds * [slider value], 1)
completionHandler:^(BOOL finished)
{
dispatch_async(dispatch_get_main_queue(), ^{
isSeeking = NO;
// Do some stuff
});
}];
Комментарии:
1. Работает просто великолепно!!
2.
CMTime
также имеетseconds
свойство удобства (среди прочих), поэтому вам не нужно выполнять вычисления самостоятельно, если вы этого не хотите.