[Kurs Qt] Odtwarzacz muzyki/filmów

W tej części kursu Qt mam przyjemność pokazać wam zestaw klas do odtwarzania multimediów: muzyki, czy filmów.

Przygotowanie


Jak już wcześniej wspomniałem, w tej lekcji kursu napiszemy sobie odtwarzacz docelowo do odtwarzania muzyki, jednak dokładnie ta sama klasa (z małym dodatkiem) może też służyć do odtwarzania filmów (co też zobaczymy).

Nasz program z poziomu menu projektowania wygląda następująco:

mediaplayer-design

Używane przeze mnie ikony można pobrać stąd.

Pole zajmujące główny obszar to QListWidget  z zablokowanym editTriggers, w nim będzie znajdowała się wizualna playlista, którą będziemy odtwarzać.

Kolejnym najbardziej rzucającym się obiektem jest niefortunnie nazwany lengthSlider, który jest paskiem, który ma nam pokazywać jaki fragment utworu jest aktualnie odtwarzany.

Dalej mamy przyciski, [+] jest przyciskiem do stworzenia playlisty, [-] do jej usunięcia, reszta jest dość intuicyjna.

 

Odtwarzanie muzyki


Aby korzystać z klas do obsługi multimediów to musimy dodać następującą linię w pliku .pro projektu:

Następnie w pliku nagłówkowym dopisujemy:

Poszczególnym slotom zajmiemy się przy ich definiowaniowaniu, lecz dla formalizmu spójrzmy na deklaracje:

Mamy także dwa dość ciekawe obiekty:

Pierwsza definicja to odtwarzacz multimedialny, który może jednoczenie odtwarzać i przechowywać w pamięci tylko 1 obiekt, do działania nie wymaga QMediaPlaylist , jednak wtedy do odtwarzania jakiejś listy utworów byśmy byli zmuszeni do ręcznego odtwarzania wszystkich utworów, tzn. byśmy musieli zaczekać aż zakończymy odtwarzać utwór, a następnie za pomocą metody setMedia(...)  uruchomić kolejny utwór z listy. Niezwykle mało przyjemne.

Na szczęście przy użyciu wbudowanej playlisty całość sprowadza się do dodania utworów na playlistę i po prostu uruchomienia jej.

Przejdźmy do konstruktora, gdzie już nieco się dzieje:

W konstruktorze (standardowo) tworzymy instancje na obiekt odtwarzacza, nadając mu przy okazji wskaźnik na rodzica, dzięki czemu w razie gdybyśmy zapomnieli go usunąć to i tak zostanie sprzątnięty chwilę przed usunięciem rodzica. Dlaj mamy domyślny konstruktor na tworzenie playlisty i łączenie slotów przycisków (nic specjalnego).

Ostatnia linia jest ważna, w niej przekazujemy wskaźnik na naszą playlistę, którą uzupełnimy później, dzięki tej linii nasz odtwarzacz wie skąd należy „brać” utwory.

Pierwszy slot odpowiada za zmianę wartości naszego suwaka w czasie odtwarzania utworu, przekazywana wartość to aktualnie odtwarzany czas utworu w milisekundach.

W razie zmiany utworu, a zatem zmiany długości utworu kolejna metoda-slot służy do zmiany maksymalnej wartości naszego suwaka:

Oprócz tych najbardziej oczywistych, to w czasie działania odtwarzacza być może w niektórych momentach będziemy chcieli wykonać działania w programie, służy do tego MediaStatus, my obsługujemy jedynie sytuację gdy nie ma żadnego utworu do odtworzenia, skończono odtwarzać utwór lub dane są niepoprawne.

Kolejny slot pozwala nam przewinąć nudniejsze fragmenty danej piosenki czy filmu za pomocą suwaka

Aby dodać utwór to po wciśnięciu przycisku wywołujemy okienko, w którym użytkownik wybiera utwory do dodania.

Linia  playlist->addMedia(QUrl::fromLocalFile(paths[i]));  służy do dodania utworu do playlisty, my jako argument podajemy ścieżkę do pliku lokalnego, jednak jak widać bezproblemowo może to być adres url do utworu.

Skoro jesteśmy przy przycisku [+] to zaczepmy jeszcze [-] 😛

 

Nie wiem jak wy, ale ja już bym chciał przetestować ten kod więc napiszmy wreszcie funkcję, która sprawi, że muzyka zagra!

Z racji, że nasz przycisk play w przypadku gdy nie odtwarzamy niczego ma działać jako „odtwórz”, a gdy gra muzyka to jako „pauza”, to mamy 2 sytuacje:

  1. Nie odtwarzamy utworów, więc po wciśnięciu zmieniamy ikonę na ikonę pauzy oraz odtwarzamy utwór.
  2. Analogicznie: ikona do odtwarzania i pauzujemy.

Jak widzimy już po tym użycie tych klas w Qt jest banalnie proste, jednak nie przedłużajmy dłużej i dokończmy nasz odtwarzacz.

Ostatnimi już przyciskami jest odtwarzanie kolejnego/poprzedniego utworu z playlisty, podobne funkcje mamy wbudowane, jednakże ja chciałbym aby w razie sytuacji, gdy użytkownik jest np. na końcu playlisty i po kliknięciu „następny utwór” kolejnym utworem był pierwszy z playlisty.

Jak na porządny odtwarzacz przystało dodajmy jeszcze odtwarzanie odpowiedniego utworu po dwukrotnym kilknięciu na jego tytule:

Obiecałem wcześniej, że powiem czym jest QModelIndex , w wielkim skrócie: jest to klasa do indeksowania obiektów na listach, drzewach, itp w Qt. Jest dwuwymiarowa, stąd musieliśmy się odwołać do rzędu, na którym jest kliknięty obiekt (lista akurat jest jednowymiarowa, dlatego 1 współrzędna wystarcza).

Jako ciekawostkę dodam jeszcze, że playlista ma wbudowane losowe generowanie playlisty ( shuffle() ), czy też różne tryby odtwarzania listy setPlaybackMode(...) , ciekawych zapraszam do dokumentacji tej klasy.

 

Odtwarzanie filmów


Jak obiecałem pokażę jeszcze sposób w jaki możemy odtwarzać filmy przy użyciu dzisiaj poznanej klasy.

Samo odtwarzanie pojedynczo, czy playlisty filmów, wygląda identycznie jak w przypadku muzyki, całość sprowadza się jedynie do wykorzystania klasy, która ten film nam wyświetli (QVideoWidget).

 

Podsumowanie


W tej lekcji dowiedzieliśmy się w jaki sposób należy korzystać z wbudowanego odtwarzacza multimediów, czy to do odtwarzania muzyki, czy filmów.

[GitHub]

Code ON!


  • Pan Kulomb

    Nie za bardzo rozumiem jak miałyby wyglądać dwuwymiarowe drzewa.

    • Może źle się wyraziłem, byśmy wypisali elementy listy w układzie współrzędnych to kolejne elementy leżałyłby jeden pod drugim. Z kolei np drzewo może się rozgałęziać i kilka elementów może być obok siebie, tzn aby dojść do jakiegoś elementu możemy podać nr kolumny i nr rzędu w jakim leży, niczym adresy komórek w tabelach w bazie danych (może później dorzucę rysunek to ilustrujący)