2012-04-06 31 views
7

mã hiện tại của tôi là:Cách sử dụng QtMultimedia để phát tệp 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); 
    } 
} 

toàn bộ điều này được bắt đầu như là một QRunnable trong một QThreadPool và phần đó hoạt động tốt. Vấn đề là tôi không bao giờ nhận được bất kỳ âm thanh nào. Thiết bị âm thanh của tôi đang hoạt động, bộ đệm được lấp đầy. Tôi không biết có gì sai. Tôi sử dụng app.exec(). Giúp đánh giá cao.

Trả lời

5
  1. Thiết bị (QBuffer) đã được mở:

    QBuffer audio_buffer(&audio_data);   
    audio_buffer.open(QIODevice::ReadOnly); 
    
  2. QAudioOutput cần một vòng lặp sự kiện để chơi bất cứ điều gì, và vòng lặp mà đã được chạy trong thread nó thuộc về. Đó là thread nó đã được tạo ra trong khi bạn không rõ ràng di chuyển nó đến một thread:

    // 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. Tất cả mọi thứ bạn phân bổ nên được deallocated khi âm thanh đã hoàn thành chơi, hoặc bạn sẽ có một rò rỉ bộ nhớ, và vòng lặp sự kiện sẽ chạy bên trong hàm, vì vậy bạn có thể phân bổ mọi thứ cục bộ.

Các vấn đề liên quan