Jak wyświetlić buforowane dane na Uisliderze za pomocą MpMoviePlayerController w systemie iOS?
Używam MPMoviePlayerController
do odtwarzania dźwięku i chcę pokazać buforowane dane na sliderze w ten sposób ...
Chcę pokazać dane bufora jak czerwona sekcja w sliderze. Próbowałem go wygooglować. Ale nie znalazłem na to żadnego rozwiązania. i jak dostosować suwak? Z góry dzięki...
3 answers
Tak możemy wyświetlać dane strumieniowe używając MPMoviePlayerController poprzez jego odtwarzanie. Wyjaśniam wszystkie te kroki, które wymagały ode mnie wykonania tego custom_slider dla mojego customize player...
(możesz bezpośrednio przeczytać Krok 4 jeśli interesuje Cię tylko część programistyczna) Są to kroki:
Krok 1: (Pierwsza część projektu) zrobiłem to przy użyciu standardowych kontrolek...
W Interface Builder umieść swój UISlider natychmiast na górze UIProgressView i uczynić je tym samym rozmiarze.
Na Uisliderze pozioma linia tła nazywa się ścieżką, sztuką jest uczynić ją niewidzialną. Robimy to za pomocą przezroczystego PNG i metod UISlider setMinimumTrackImage:forState: oraz setMaximumTrackImage: forState:.
W metodzie viewDidLoad kontrolera widoku dodaj:
[ProgressSlider setMinimumTrackImage:minImage forState:UIControlStateNormal];
[ProgressSlider setMaximumTrackImage:transparentImage forState:UIControlStateNormal];
[progressBar setTrackImage:maxImage];
[progressBar setProgressImage:streamImage];
Gdzie ProgressSlider odnosi się do Twojego UISlider i progressBar do Twojego UIProgressView.
Oraz możesz zrobić przezroczysty obraz programowo w ten sposób.
UIGraphicsBeginImageContextWithOptions((CGSize){512,5}, NO, 0.0f);
UIImage *transparentImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
Można zmienić jego rozmiar w zależności od postępu widok śledzenia obrazu wysokość szerokość... Używam {512,5} możesz użyć {1,1} dla domyślnego suwaka i widoku postępu.
Odniesienie do tej odpowiedzi https://stackoverflow.com/a/4570100/3933302
Krok 2:
Teraz próbowałem ustawić ścieżkę i postęp obrazu UIProgressView. Ale nie pokazywał toru i postępu obraz. potem znalazłem to. solution...to użyj tej biblioteki dostępnej na GitHubie. https://gist.github.com/JohnEstropia/9482567
Teraz zmieniłem wystąpienia UIProgressView na JEProgressView, w tym te w Stalówkach i storyboardach.
Zasadniczo, trzeba będzie wymusić przypisanie obrazów bezpośrednio do Uiprogressview dzieci UIImageViews.
Podklasa jest potrzebna do nadpisania layoutSubviews, gdzie można dostosować wysokość obrazów zgodnie z rozmiary obrazów.
Odniesienie zaczerpnięte z tej odpowiedzi https://stackoverflow.com/a/22322367/3933302
Krok 3:
Ale teraz pytanie, z którego będzie można zrobić obraz dla slider i progressView. Jest to wyjaśnione w tym samouczku i możesz również pobrać psd.
Http://www.raywenderlich.com/32167/photoshop-tutorial-for-developers-creating-a-custom-uislider
Krok 4:
Teraz przyjdź do część programistyczna .. za pomocą grywalnego czasu trwania można wyświetlać dane strumienia..(co było moim największym problemem)
Za pomocą MPMovieLoadStatePlayable możemy uzyskać, gdy bufor ma wystarczającą ilość danych, że odtwarzanie może się rozpocząć, ale może zabraknąć danych przed zakończeniem odtwarzania.
Teraz w Twoim Metoda PlayAudio...umieść ten kod..
-(void) playAudio:(NSURL *) url {
.............
streamTimer= [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(loadStateChange) userInfo:nil repeats:YES];
..........
}
A oto definicja 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;
}
A oto definicja updateProgressUI
- (void)updateProgressUI{
if(self.moviePlayer.duration == self.moviePlayer.playableDuration){
// all done
[slideTimer invalidate];
}
progressBar.progress = self.moviePlayer.playableDuration/self.moviePlayer.duration ;
}
Mam nadzieję, że ten w pełni dostosowany suwak pomoże Ci wiele w tworzeniu niestandardowego odtwarzacza...Wyjaśniłem całą moją pracę krok po kroku.....Dzięki ....
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:01:33
Nie możesz tego zrobić z MPMoviePlayerController
.
Jednak jeśli przełączysz się na {[1] } wtedy możesz użyć AVPlayerItem.loadedTimeRanges
. Zawiera wszystkie informacje potrzebne do wizualizacji w niestandardowej kontroli.
Istnieje wiele pytań, które zostały zadane na ten temat, na przykład:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:24:21
Zgodnie z dokumentacją MPMoviePlayerController
(dostępną tutaj) możesz użyć właściwości playableDuration
, Aby pobrać czas, który został załadowany przez gracza.
Będziesz musiał podklasować UISlider
, aby narysować czerwoną część kontrolki w metodzie drawRect:
.
Jeśli chodzi o AVPlayer
to wywołałbyś loadedTimeRanges
(dokumentacja tutaj) na AVPlayerItem
reprezentującej Twoją treść. To daje tablicę (od iOS 8) pojedynczy CMTimeRange
reprezentujący część nośnika, który ma został zbuforowany. Radzę użyć [NSArray firstObject]
podczas pobierania zakresu czasowego, aby zabezpieczyć kod przed ewentualnie pustą tablicą.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-19 16:38:25