[DirectX] Nieprawidłowy czas piosenki

0

Witam ;)

Mam kłopot z DirectX.AudioVideoPlayback ...
W niektórych piosenkach player, którego właśnie piszę podaje zły czas całkowity odtwarzanej piosenki ;/
Jednak w niektórych czas ten jest prawidłowy.
Metoda odpowiadająca za pobranie czasu wygląda tak:

        private string calkowityCzas()
        {
            int sec = (int)audio.Duration;
            int hour = sec / 3600;
            int min = (sec - (hour * 3600)) / 60;
            sec = sec - (hour * 3600 + min * 60);
            string czasTrwania = String.Format("{0:D2}:{1:D2}:{2:D2}", hour, min, sec);
            return czasTrwania; 

        }

Co tu jest nie tak??
Czy może chodzi o coś całkiem innego??

0

Wpierw zbadaj, czy odczytany czas w sekundach jest poprawny (debuger lub wyświetlenie na konsoli)

private string calkowityCzas()
{
int sec = (int)audio.Duration;
Console.WriteLine("czas = "+sec);
int hour = sec / 3600;
int min = (sec - (hour * 3600)) / 60;
sec = sec - (hour * 3600 + min * 60);
string czasTrwania = String.Format("{0:D2}:{1:D2}:{2:D2}", hour, min, sec);
return czasTrwania;

    }
0

Trochę nad tym myślałem i jedyne czego się dowiedziałem to to ,że jest to wina linijki

int sec = (int)audio.Duration;

audio.Duration pobiera nieprawidłową długość piosenki u mnie na kompie ;/
Ma ktoś jakiś pomysł jaka jest tego przyczyna??

0

Może w pliku z piosenką jest zła informacja. Otwórz innym programem (np. Winamp), który pokazuje długość piosenki.

0

Tu nie chodziło o informacje z konkretnej piosenki bo tak się dzieje z wszystkimi piosenkami. W dymku, który pokazuje się po najechaniu na ikonę pliku z piosenka czas jest prawidłowy. W Windows Media Playerze i QuickTimie też jest ok. Ale już w SubEditPlayer i MediaPlayerClassicu czas jest także nieprawidłowy (np. piosenka o długości ok. 6 min ma długość 30 min ;p ).
Myślę, że to może być sprawa kodeków i zaraz to sprawdzę.

Jednak nie ;/

Ma ktoś jakieś pomysły?? Może DirectXa przeinstalować??

0

W niektórych piosenkach player, którego właśnie piszę podaje zły czas całkowity odtwarzanej piosenki ;/
Jednak w niektórych czas ten jest prawidłowy.

Tu nie chodziło o informacje z konkretnej piosenki bo tak się dzieje z wszystkimi piosenkami.

Zdecyduj się

0

No w sumie to do tej pory w 2 utworach spotkałem się z prawidłowym czasem...
Dlatego możliwe ze to jest tylko przypadek ze czas jest prawidłowy...
Bo im więcej piosenek sprawdziłem tym więcej jest złych czasów ;/

0

Jeżeli jesteś w 100% pewny, że pliki są prawidłowe (np. błędy spowodowane przez transmisję p2p) to najpewniej jest to wina kodeka.

0

Pewnie kodek wykrzacza sie na plikach mp3 o zmiennym bitrate. Jezeli kodek nie jest pierwszej nowosci, to jest typowe (winamp zawsze pokaze dobrze, bo nie wykorzystuje zewnetrznych kodekow do dekodowania mp3).

0

używam k-lite mega codec pack w najnowszej wersji
i czas ten się pobiera niepoprawnie nie tylko w moim playerze ale także
w np. Media Player Classic (który jest załączony do tego packa).
Więc to chyba nie jest normalne.
Natomiast w Windows Media Player już jest wszystko ok.
Przeinstalowanie kodeków i DirectX nic nie dało i dlatego nie mam pojęcia co mogę zrobić
żeby to naprawić ;/

0

A mozesz zamiescic przykladowy plik? Prawie na pewno to mp3 ze starym VBR - tam bardzo czesto wystepowaly problemy z odczytem czasu całkowitego, a czasami wrecz to bylo niemozliwe. Pierwsze wersje winampa pokazywaly w takim przypadku albo błędny czas, albo czas całkowity był zmienny w czasie odtwarzania... windows media player tez podobnie miał

Jestem zdania, że to kodek tak odczytuje, a w WMplyaer jest jakis workaround dla takich plików (jaki - nie zgadniesz). Jeżeli w ogólw WMplayer korzysta w taki sposób z DirectX do odtwarzania audio (to wcale nie jest pewne).

0

Załączam przykładowy plik.

http://odsiebie.com/pokaz/794428---038f.html

Czas trwania w WMP to 4:15
Czas trwania w moim odtwarzaczu 5:48 (!) ;/

0

To mp3 VBR, prawdopodobnie kodowany starą metodą. Chyba niewiele mozesz zrobic używając tego frameworka do odtwarzania.
Po prostu są trudności z odczytem długości takich plików.

Ja bym jeszcze zobaczył, czy podobnie będzie przy użyciu DirectShow.

0

Czyli to wina frameworka... ;)
Już myślałem, że to ja coś popsułem ;p
Ale faktycznie spróbuje jeszcze z DirectShow.

THX za pomoc ;)

Pozdrawiam

PS. DirectShow zachowuje się tak samo. Więc pozostanę przy AudioVideoPlayback.
I mam nadzieję, że w wersji 4.0 frameworka to naprawią ;/

Żeby nie zakładać nowego tematu to dodam pytanie tutaj...

Jako, że DirectX to nie za bardzo nadaje się do odtwarzania VBR,
a kodowanie to jest bardzo popularne, więc chciałbym zmienić bibliotekę na jakąś inną.
Mógłby ktoś mi polecić jakąś dobrą i prostą w obsłudze?? ;p

0

Bass. Co prawda jest to biblioteka natywna, ale posiada wrappera Bass.NET - bardzo proste w użyciu. a możliwości prawie nieograniczone. Mozesz zrobic odtwarzacz porównywalny z Winampem używając tego.

0

I mam nadzieję, że w wersji 4.0 frameworka to naprawią ;/

Nie naprawią. Te klasy to część Managed DirectX 1.0, wersja 2.0 została już dawno porzucona i przekształciła się w XNA (który notabene długość tego pliku odczytuje poprawnie).

0

Jakoś ten Xna jest dla mnie zbyt skomplikowany ;p
Nie mogę go rozgryźć w ogóle... Dlatego wziąłem się za Bass.Net.dll.
Jednak też zrozumienie go idzie mi bardzo powoli...

Jeśli ktoś zna się coś w tym temacie to proszę o zaglądnięcie na

http://4programmers.net/Forum/viewtopic.php?id=133451

0

prosta rada - użyć konwertera do innego formatu, np do .wav i potem znów do .mp3 i działa :)

0

Ale macie problem. ;) Po prostu długość jest liczona na podstawie rozmiaru pliku i bitrate. Jeśli plik MP3 jest CBR - długość jest odczytywana raczej dokładnie, a jeśli VBR - w przybliżeniu. Kodek tutaj nie ma znaczenia. Żeby poznać dokładną długość trzeba by przelecieć przez cały plik i policzyć ramki. Tak samo pojawi się problem jeśli będziesz chciał "skoczyć" do konkretnego czasu piosenki. W niektórych (większości/wszystkich?) plikach VBR informacja o długości jest zapisywana wewnątrz pliku (enkoder LAME chyba to robił jeśli dobrze pamiętam). Może to Cię zainteresuje - http://developer.novell.com/wiki/index.php/TagLib_Sharp, była tam chyba metoda do odczytu długości.

P.S. Już wole WMP niż Bass. :P

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