Odtwarzacz MP3 QT

0

Siemka,

z pomocą poradnika napisałem odtwarzacz mp3.
Wszystko super, ale dźwięk jaki odtwarza jest hmm, słabej jakości. Co sekundę, dwie słychać zakłócenie, przerwanie itd.

Łapcie .exe: http://hostuje.net/file.php?id=313d16c79d81ae63d8c5f65d709e225a

Spróbujcie odtworzyć jakieś mp3, to będziecie wiedzieć o co chodzi. (Na windows7 aplikacja nie chce odtwarzać plików wgl... Nad tym popracuję jutro.)

Tutaj kod: http://pastebin.com/zD8jqwnH

Czy jest jakiś sposób aby zrobić coś z tym odtwarzanym dźwiękiem? Przeszukałem już dokumentację QMediaPlayer, QAudio itd. Jakies pomysły? :/

0

Wrzuć pełen kod projektu, razem z nagłówkiem i ui.

0

https://github.com/insectoman/MusicPlayer - powinno śmigać. Github nie taki prosty jak go malują :D

2

Ok, u mnie też działa "skokowo".
Przyczyną jest złe połączenie ze sobą paska postępu i obiektu Player.
W tej chwili działa to tak:

  1. Rozpoczynasz odtwarzanie piosenki.
  2. Player emituje sygnał positionChanged(qint64)
  3. Odbierasz sygnał slotem PositionChanged(qint64) i ustawiasz nową pozycję LengthSlider
    4. LengthSlider emituje sygnał valueChanged(int)
  4. Łapiesz sygnał valueChanged(int) slotem SetPosition(int) i wywołujesz metodę setPosition(int) na obiekcie Player
    Czyli co około sekundę piosenka była cofana o x milisekund.
    Problem zidentyfikowany, rozwiązanie chyba sam wykminisz.
0
Lukaszmey napisał(a):

Ok, u mnie też działa "skokowo".
Przyczyną jest złe połączenie ze sobą paska postępu i obiektu Player.
W tej chwili działa to tak:

  1. Rozpoczynasz odtwarzanie piosenki.
  2. Player emituje sygnał positionChanged(qint64)
  3. Odbierasz sygnał slotem PositionChanged(qint64) i ustawiasz nową pozycję LengthSlider
    4. LengthSlider emituje sygnał valueChanged(int)
  4. Łapiesz sygnał valueChanged(int) slotem SetPosition(int) i wywołujesz metodę setPosition(int) na obiekcie Player
    Czyli co około sekundę piosenka była cofana o x milisekund.
    Problem zidentyfikowany, rozwiązanie chyba sam wykminisz.

Dzięki wielkie. :)

Ok, działa.

Co powiesz na takie rozwiązanie:
connect(ui->LengthSlider,SIGNAL(sliderMoved(int)),this,SLOT(SetPosition(int)));

0

Pytanie jakie chcesz uzyskać zachowanie?
Jeśli użytkownik trzyma slider to muzyka ma zmieniać miejsce odtwarzania? czy może powinieneś zaczekać, aż użytkownik puści slider?

0

Obecna funkcjonalność mi odpowiada.

Mam inny problem. Chcę by tytuł piosenki obecnie granej wyświetlał się na pasku tytułu okna. Taka informacja dla użytkownika co jest teraz grane. I tutaj utknąłem. Wiem jak pobrac z playlisty indeks obecnie granej piosenki, ale jak z tego indeksu wyciągnąć nazwę piosenki?

Próbowałem kombinować z connect'em (github zaktualizowany), ale to bez sensu co robię.

Próbowałem pobrać z playlisty te informacje ale też lipa, nie znalazłem metody do tego.

int temp=PlayList->currentIndex();

Czy jest sposób aby posiadając indeks obecnie wybrany wyciągnąć z niego nazwę piosenki?

Na QListWidget wrzucam takim sposobem:

 ui->playlist->addItem(QFileInfo(paths[i]).fileName());

Naprawdę przewertowałem dokumentacje, ale niestety nic tam nie znalazłem. :/

EDIT.: Zrobiłem to tak:

QStringList paths 

z metody Add dałem jako prywatny obiekt klasy MusicPlayer, wtedy:

void MusicPlayer::SetWindowTitle()
{
    int i=PlayList->currentIndex();
    this->setWindowTitle(QFileInfo(paths[i]).fileName());
} 

I wywołuje SetWindowTitle za każdym razem w kodzie kiedy zmieniam piosenkę, play itd. Ale to rozwiązanie kiepskie i nie optymalne. Ma ktoś lepszy pomysł?

EDIT2: Mój sposób działa błędnie, ustawia złe tytuły. :/

0

Pisząc tytuł piosenki masz na myśli nazwę pliku czy nazwę piosenki z tagów pliku np. mp3?
Jeśli chcesz to rzuć okiem na mój projekt który pisałem rok temu, chciałem do odczytywania tagów wykorzystać bibliotekę id3tag, ale widocznie jakieś inne sprawy się pojawiły, bo nigdy nie dokończyłem tego. https://github.com/Lukaszm94/QtMusicPlayer
Ale jeśli chodzi o wyciąganie nazwy obecnie odtwarzanego pliku to robiłem to w podobny sposób jak pokazałeś, z tym że ja dodałem własną implementację playlisty (bo z tego co pamiętam na interfejsach klasy odpowiedzialnej za playlistę w Qt ciężko było zrealizować te funkcje programu, które chciałem zaimplementować - możliwe że coś teraz mieszam, nie pamiętam dokładnie).

Poza tym "nieoptymalne", a nie "nie optymalne" +

premature optimization is the root of all evil

0

Nazwa pliku wystarczy. Zerknę, dzięki :)

No i rozwiązałem:

Dodałem prywatny obiekt

QVector <QString> temp_title;

Do Add dodałem dodawanie tytułu piosenki do temp_title:

for(int i=0;i<paths.size();i++)
    {
        ui->playlist->addItem(QFileInfo(paths[i]).fileName());
        temp_title.push_back(QFileInfo(paths[i]).fileName());
        PlayList->addMedia(QUrl::fromLocalFile(paths[i]));
    } 

I do wyświetlania tytułu:

void MusicPlayer::ShowTitle()
{
    int i=PlayList->currentIndex();
    this->setWindowTitle(temp_title[i]);
} 

Działa jak trzeba ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1