Как показать буферизованные данные в UISlider с помощью MpMoviePlayerController в iOS?

Я использую MPMoviePlayerController для воспроизведения звука, и я хочу показать буферизованные данные на слайдере, как это...

enter image description here

Я хочу показать данные буфера, как красный раздел в слайдере. Я попытался это сделать. Но у меня не было никакого решения. и Как настроить ползунок? Спасибо заранее...

Ответ 1

Да Мы можем показать данные потока с помощью MPMoviePlayerController по playableDuration. Я объясняю, что все эти шаги помогли мне сделать этот custom_slider для моего персонализированного проигрывателя...

(Вы можете читать шаг 4, если вы только заинтересованы в программировании) Это следующие шаги:

Шаг 1: (первая часть дизайна). Я сделал это с помощью стандартных элементов управления...

В интерфейсе Builder поместите ваш UISlider непосредственно поверх своего UIProgressView и сделайте их одинакового размера.

На UISlider фоновая горизонтальная линия называется дорожкой, трюк - сделать ее невидимой. Мы делаем это с помощью прозрачного PNG и методов UISlider setMinimumTrackImage: forState: и setMaximumTrackImage: forState:.

В методе viewDidLoad вашего контроллера просмотров добавьте:

[ProgressSlider setMinimumTrackImage:minImage forState:UIControlStateNormal];

[ProgressSlider setMaximumTrackImage:transparentImage forState:UIControlStateNormal];
[progressBar setTrackImage:maxImage];
[progressBar setProgressImage:streamImage];

где ProgressSlider ссылается на ваш UISlider и progressBar на ваш UIProgressView.

и вы можете сделать прозрачное изображение программно таким образом.

 UIGraphicsBeginImageContextWithOptions((CGSize){512,5}, NO, 0.0f);
    UIImage *transparentImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();

вы можете изменить его размер в соответствии с шириной высоты изображения дорожки представления прогресса. Я использую {512,5}, вы можете использовать {1,1} для стандартного слайдера и просмотра прогресса.

Ссылка, принятая с таким ответом fooobar.com/questions/145963/...

Шаг 2:

Теперь я попытался установить дорожку и выполнить изображение UIProgressView. Но он не показывал дорожку и изображение прогресса. то я нашел это решение... использовать эту библиотеку, доступную в github. https://gist.github.com/JohnEstropia/9482567

Теперь я изменил вхождения UIProgressView в JEProgressView, в том числе в NIB и раскадровки.

В принципе, вам нужно принудительно назначать изображения непосредственно в UIImageViews UIProgressView.

Подкласс необходим для переопределения layoutSubviews, где вы настраиваете высоты изображений в соответствии с размерами изображений.

Ссылка, взятая из этого ответа fooobar.com/questions/108763/...

Шаг 3:

Но теперь возникает вопрос, из которого вы сделаете изображение для слайдера и progressView. Это объясняется в этом уроке, и вы также можете скачать psd.

http://www.raywenderlich.com/32167/photoshop-tutorial-for-developers-creating-a-custom-uislider

Шаг 4:

Теперь приступим к программированию. используя длительность воспроизведения, можно показать данные потока.. (что было моей самой большой проблемой)

Используя MPMovieLoadStatePlayable, мы можем получить, когда в буфере есть достаточно данных, которые могут начаться, но может закончиться до того, как воспроизведение закончится.

https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerController_Class/index.html#//apple_ref/c/tdef/MPMovieLoadState

Теперь в вашем методе PlayAudio... поместите этот код..

-(void) playAudio:(NSURL *) url {
.............
streamTimer= [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(loadStateChange) userInfo:nil repeats:YES];
..........
}

и вот определение loadStateChange

-(void)loadStateChange
{
if(self.moviePlayer.loadState == MPMovieLoadStatePlayable){

    [self.moviePlayer play];

    slideTimer = [NSTimer scheduledTimerWithTimeInterval:0.5
                                                  target:self
                                                selector:@selector(updateProgressUI)
                                                userInfo:nil
                                                 repeats:YES];
    [streamTimer invalidate];
}
else if(self.downloadList)
//if you are playing local file then it will show track with full red color
    progressBar.progress= appDel.moviePlayerController.moviePlayer.duration;
}

и вот определение updateProgressUI

- (void)updateProgressUI{
    if(self.moviePlayer.duration == self.moviePlayer.playableDuration){
        // all done
        [slideTimer invalidate];
    }
    progressBar.progress = self.moviePlayer.playableDuration/self.moviePlayer.duration ;

}

Я надеюсь, что этот полностью настраиваемый слайдер поможет вам в создании пользовательского плеера... Я объяснил всю свою работу в шагах..... Спасибо....

Ответ 2

Вы не можете сделать это с помощью MPMoviePlayerController.

Однако, если вы переключитесь на AVPlayer, вы можете использовать AVPlayerItem.loadedTimeRanges. Он содержит всю необходимую информацию для визуализации в пользовательском элементе управления.

В этой теме задано несколько вопросов, например:

Прогресс AVPlayer для потоковой передачи

Ответ 3

В соответствии с документацией MPMoviePlayerController (доступно здесь) вы можете использовать свойство playableDuration для получения времени, которое было загружено игрока.

Затем вам понадобится подкласс UISlider, чтобы нарисовать красную часть вашего элемента управления в методе drawRect:.

Что касается AVPlayer, вы можете называть loadedTimeRanges (документация здесь) на AVPlayerItem, представляющем ваш контент. Это даст вам массив (с iOS 8) одного CMTimeRange, представляющего часть вашего носителя, который был буферизирован. Я бы посоветовал использовать [NSArray firstObject] при получении временного диапазона для защиты вашего кода от возможно пустого массива.