Pracuję nad odtwarzaniem audio ze strumienia audio przy użyciu VC++ z biblioteką QtMultimedia. Ponieważ nie jestem zbyt doświadczony z bibliotek Qt Zacząłem od czytania w pliku .wav i zapisie do bufora:Odtwarzaj dane audio za pomocą QIODevice (Qt4.6 z VC++)
ifstream wavFile;
char* file = "error_ex.wav";
wavFile.open(file, ios::binary);
potem użyłem funkcji ifstream za .read() i zapisywać wszystkie dane do bufor. Po bufor jest napisane to wysłany do nagrywarki audio, które przygotowuje ją do Qt:
QByteArray fData;
for(int i = 0; i < (int)data.size(); ++i)
{
fData.push_back(data.at(i));
}
m_pBuffer->open(QIODevice::ReadWrite);
m_pBuffer->write(fData);
m_pBuffer->close();
(m_pBuffer jest typu QBuffer)
Po QBuffer jest gotowy próbuję odtworzyć bufor:
QIODevice* ioDevice = m_pAudioOut->start();
ioDevice->write(m_pBuffer->buffer());
(m_pAudioOut jest typu QAudioOutput)
wynika to w małym pop z głośników, a potem przestaje grać. Jakieś pomysły, dlaczego?
Uruchamianie Visual Studios 2008 w systemie Windows XP SP2 przy użyciu biblioteki Qt 4.6.3.
Ah! Dzięki temu jest znacznie lepszym źródłem informacji niż tylko dokumentacja Qt. "Klonuję" przykładowy kod, który odpowiada moim potrzebom. Wpadłem jednak na dwie kwestie. Kiedy próbuję użyć trybu pull, otrzymuję taki sam wynik jak poprzednio wraz z ostrzeżeniem QObject o tym, jak należy uruchamiać QTimers w wątku. Następnie, gdy używam trybu push, wywołanie odczytu zwraca -1 (błąd). Co prowadzi mnie do przekonania, że coś z moim buforem jest złe. Będę kontynuować pracę nad tym. Dzięki za pomoc. – Tony
Więc patrzę bardziej na metodę pull. Moja metoda "play" po prostu otwiera QBuffer, a następnie uruchamia QAudioOutput (jest to zgodne z przykładem wraz z dokumentacją Qt). Brzmi, jakby zagrał pierwszą nutę, a potem przestał. Ta metoda nie powinna wymagać ode mnie ręcznego upewnienia się, że odtwarza wszystkie pakiety. Pomysły? – Tony
Moje przeczucie było słuszne. Uruchomienie go w aplikacji linii poleceń spowodowało, że program zakończył się i niemal natychmiast zabił dźwięk. Dodałem swój kod do aplikacji GUI i zadziałało! Dzięki za pomoc! – Tony