Qt - odtwarzanie plików muzycznych za pomocą klasy QMediaPlayer

Stronę tą wyświetlono już: 25 razy

Wstęp

Klasa QMediaPlayer jak nie trudno się domyślić służy do odtwarzania plików audio i video. Smutnym faktem jest jednak to, że do odtwarzania takich plików niezbędna jest obecność w systemie odpowiednich kodeków. W przypadku ich braku nie zależnie od systemu operacyjnego odtworzenie danego pliku zakończy się niepowodzeniem. Oprócz klasy QMediaPlayer warto też zapoznać się z klasą QMediaList, która umożliwia tworzenie listy odtwarzanych plików a także sterowaniem zapętlaniem odtwarzania pliku.

Zarówno klasa QMediaPlayer jak i QMediaList wymagają dopisania w pliku .pro następującej linijki:

Listing 1
  1. QT += multimedia

oznaczającej, że dodatkowe biblioteki zostaną dołączone do programu i będzie można z nich korzystać. Dodatkowo konieczne będzie załączenie pliku nagłówkowego QMediaPlayer oraz QMediaPlaylist.

Tworzenie listy odtwarzanych plików i ich odtwarzanie

Oto bardzo prosty kod, pokazujący jak można stworzyć listę kilku plików, zapętlić je oraz uruchomić ich odtwarzanie:

Listing 2
  1. playlist = new QMediaPlaylist(this); // tworzę obiekt klasy QMediaPlaylist
  2. playlist->addMedia(QMediaContent(QUrl::fromLocalFile("C:/audio1.mp3"))); // dodaję plik
  3. playlist->addMedia(QMediaContent(QUrl::fromLocalFile("C:/audio2.mp3"))); // dodaję kolejny plik
  4. playlist->setPlaybackMode(QMediaPlaylist::Loop); // ustawiam odtwarzanie zapętlone
  5. player = new QMediaPlayer(this); // tworzę obiekt klasy QMediaPlayer
  6. player->setPlaylist(playlist); // podpinam pod obiekt klasy QMediaPlayer wcześniej utworzony obiekt listy odtwarzania
  7. player->play(); // uruchamiam odtwarzanie

Uruchamianie, wstrzymywanie i zatrzymywanie odtwarzania pliku

Klasa QMediaPlayer posiada następujące sygnały sterujące odtwarzaniem pliku multimedialnego:

  • play - uruchamia odtwarzanie pliku z listy odtwarzania;
  • stop - zatrzymuje odtwarzanie pliku z listy odtwarzania;
  • pause - wstrzymanie odtwarzania pliku

Tryby odtwarzania plików z obiektu klasy QMediaPlaylist

Metoda setPlaybackMode umożliwia sterowanie sposobem odtwarzania plików znajdujących się na liście za pomocą następujących flag sterujących:

  • QMediaPlaylist::CurrentItemOnce - odtwarza plik z ustawionego obecnie indeksu listy;
  • QMediaPlaylist::CurrentItemInLoop - odtwarza w kółko plik z ustawionego obecnie indeksu listy;
  • QMediaPlaylist::Sequential - odtwarza całą listę od bieżącego elementu do ostatniego, po odtworzeniu którego zatrzymuje odtwarzanie;
  • QMediaPlaylist::Loop - odtwarza kolejno pliki z listy a po zakończeniu odtwarzania ostatniego rozpoczyna odtwarzanie od pierwszego pliku na liście;
  • QMediaPlaylist::Random - odtwarza pliki z listy w sposób losowy;

Sterowanie głośnością odtwarzanego dźwięku

Klasa QMediaPlayer umożliwia ustawienie głośności odtwarzanej ścieżki dźwiękowej za pomocą metody volume, które przyjmuje wartość całkowitą z przedziału od 0 do 100. Istnieje również możliwość pozyskania informacji o aktualnie ustawionej głośności za pomocą metody volume.

Długość odtwarzanego pliku oraz pozycja odtwarzania

Każdy plik multimedialny zawiera informację o czasie jego trwania. Czas bieżącego odtwarzanego pliku można pozyskać za pomocą metody duration, która zwraca wartość typu quint64 określającą czas trwania pliku w milisekundach. Wartość ta może nie być od razu dostępna, gdyż jest ona ustawiana dopiero po wywołaniu sygnału durationChanged.

Możliwe jest również uzyskanie informacji o bieżącej pozycji odtwarzanego pliku multimedialnego za pomocą metody position, która również zwraca wartość typu quint64 określającą czas odtwarzania pliku w milisekundach. Każda zmiana położenia odtwarzania wiąże się z wywołaniem sygnału positionChanged. Możliwe jest ustawienie położenia odtwarzania pliku za pomocą metody setPosition. Ważne jest aby mieć na uwadze, że kontrolka QSlider wykorzystywana często do wyświetlania bieżącej pozycji odtwarzania pliku multimedialnego nie pozawala na poprawną bezpośrednią obsługę plików o długim czasie odtwarzania. Spowodowane jest to tym, że wartość reprezentowana przez tą kontrolkę jest typu int co znacznie odbiega zakresem od typu quint64. Zaradzić temu można stosując skalę procentową co wymaga zastosowania przeliczania bieżącej pozycji odtwarzania na wartość procentową.

Strony powiązane
strony powiązane
  1. doc.qt.io/qt-5/qmediaplayer.html - opis klasy QMediaPlayer na stronie dokumentacji Qt
  2. doc.qt.io/qt-5/qmediaplaylist.html - opis klasy QMediaPlaylist na stronie dokumentacji Qt

Komentarze