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 ...

Tutaj wpisz opis obrazka

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...

Author: Sourabh Sharma, 2014-12-17

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.

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

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 ....

 10
Author: Sourabh Sharma,
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:

AVPlayer streaming progress

 4
Author: highmaintenance,
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ą.

 3
Author: Jonathan Schmidt,
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