2012-04-06 7 views
7

Mój obecny kod jest:Jak korzystać z QtMultimedia do odtwarzania plików wav?

void Sound::run() { 
    QFile audio_file(mResourcePath); 
    if(audio_file.open(QIODevice::ReadOnly)) { 
     audio_file.seek(44); // skip wav header 
     QByteArray audio_data = audio_file.readAll(); 
     audio_file.close(); 

     QBuffer* audio_buffer = new QBuffer(&audio_data); 
     qDebug() << audio_buffer->size(); 

     QAudioFormat format; 

     format.setSampleSize(16); 
     format.setSampleRate(44100); 
     format.setChannelCount(2); 
     format.setCodec("audio/pcm"); 
     format.setByteOrder(QAudioFormat::LittleEndian); 
     format.setSampleType(QAudioFormat::UnSignedInt); 

     QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); 
     if (!info.isFormatSupported(format)) { 
      qWarning()<<"raw audio format not supported by backend, cannot play audio."; 
      return; 
     } 
     qDebug() << info.deviceName(); 

     QAudioOutput* output = new QAudioOutput(info, format); 
     output->start(audio_buffer); 
    } 
} 

Ta cała sprawa jest uruchamiany jako QRunnable w QThreadPool i ta część działa dobrze. Problem polega na tym, że nigdy nie dostaję żadnego dźwięku. Moje urządzenie dźwiękowe działa, bufor jest wypełniony. Nie wiem co jest źle. Używam app.exec(). Pomoc doceniona.

Odpowiedz

5
  1. Urządzenie (QBuffer) musi być otwarty:

    QBuffer audio_buffer(&audio_data);   
    audio_buffer.open(QIODevice::ReadOnly); 
    
  2. QAudioOutput potrzebuje pętli zdarzenia grać cokolwiek, i że pętla ma być uruchomiony w wątku, do której należy. Który jest wątek został stworzony w jeśli nie wprost przenieść go do innego wątku:

    // Create the device and start playing... 
    QAudioOutput output(info, format); 
    output.start(&audio_buffer);  
    
    // ...then wait for the sound to finish 
    QEventLoop loop; 
    QObject::connect(&output, SIGNAL(stateChanged(QAudio::State)), &loop, SLOT(quit())); 
    do { 
        loop.exec();    
    } while(output.state() == QAudio::ActiveState);   
    
  3. Wszystko, co należy przeznaczyć dealokowane gdy dźwięk zakończył grę, czy też masz wyciek pamięci i pętla zdarzeń będzie teraz działać wewnątrz funkcji, więc możesz przydzielić wszystko lokalnie.

Powiązane problemy