Sto lavorando alla riproduzione di audio da un flusso audio utilizzando VC++ con la libreria QtMultimedia. Dal momento che non sono troppo sperimentato con le librerie di Qt ho iniziato con la lettura in un file wav e la scrittura di un buffer:Riprodurre dati audio utilizzando QIODevice (Qt4.6 con VC++)
ifstream wavFile;
char* file = "error_ex.wav";
wavFile.open(file, ios::binary);
Dopo di che, ho usato la funzione di ifstream .read() e scrivere tutti i dati in un buffer Dopo che il buffer è scritto è espulso allo scrittore audio che lo prepara per 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 è di tipo QBuffer)
Una volta che il QBuffer è pronto tento di giocare il buffer:
QIODevice* ioDevice = m_pAudioOut->start();
ioDevice->write(m_pBuffer->buffer());
(m_pAudioOut è di tipo QAudioOutput)
Questo si traduce in un piccolo pop dagli altoparlanti e poi si interrompe la riproduzione. Tutte le idee perché?
Esecuzione di Visual Studios 2008 su Windows XP SP2 utilizzando la libreria Qt 4.6.3.
Ah! Grazie questa è una fonte d'informazione molto migliore della semplice documentazione Qt. Sto "clonando" il codice di esempio che è rilevante per le mie esigenze. Ho incontrato due problemi però. Quando tento di utilizzare la modalità pull, ottengo lo stesso risultato di prima insieme a qualche avvertimento QObject su come i QTimers devono essere avviati in una discussione. Quindi, quando utilizzo la modalità push, la chiamata di lettura restituisce -1 (errore). Il che mi porta a credere che qualcosa con il mio buffer sia sbagliato. Continuerò a lavorare su questo. Grazie per l'aiuto. – Tony
Quindi sto esaminando il metodo pull. Il mio metodo "play" apre semplicemente QBuffer e poi QAudioOutput lo avvia (segue l'esempio insieme alla documentazione Qt). Sembra che suoni la prima nota e poi si fermi. Questo metodo non dovrebbe richiedere a me di verificare manualmente che riproduca tutti i pacchetti. Idee? – Tony
La mia impressione era giusta. L'esecuzione in un'applicazione a riga di comando ha causato la chiusura del programma e la chiusura dell'output audio quasi istantaneamente. Ho aggiunto il mio codice a un'applicazione GUI e ha funzionato! Grazie per l'aiuto! – Tony