Почему на Android не воспроизводится WAV файл, который был загружен в QBuffer с использованием QMediaPlayer?

Я пытаюсь загрузить wav файл в QBuffer и воспроизвести его с помощью QMediaPlayer. Внизу приведен мой код:

```cpp
QMediaPlayer* m_channel[6];
QAudioOutput* m_audioOutput[6];

void create()
{
    for(int a1 = 0; a1 < 6; a1++)
    {
        m_channel[a1] = new QMediaPlayer();
        m_audioOutput[a1] = new QAudioOutput();
        m_channel[a1]->setAudioOutput(m_audioOutput[a1]);
    }
}

QBuffer* buffer = nullptr;

void load(QString path)
{
    QFile file(path);
    if (file.open(QIODevice::ReadOnly))
    {
        QByteArray* arr = new QByteArray(file.readAll());
        file.close();
        buffer = new QBuffer(arr);
        buffer->open(QIODevice::ReadOnly);
        buffer->seek(0);
    }
}

inline int playSFX(SoundFX *num)
{
    bool found = false;
    int chan_n = -1;
    for (int a1 = 0; a1 < 6; a1++)
    {
        if (!found)
        {
            if (m_channel[a1]->playbackState() == QMediaPlayer::StoppedState)
            {
                m_channel[a1]->setSourceDevice(num->buffer, QUrl("some.wav"));
                m_channel[a1]->play();
                found = true;
                chan_n = a1;
            }
        }
    }
    return chan_n;
}
```

На Windows все работает, звук проигрывается без проблем. Однако на Android тишина, и никаких сообщений об ошибках не появляется. Что я могу упускать? В чем может заключаться проблема?
  • 19 октября 2024 г. 14:53
Ответы на вопрос 1
Проблема с воспроизведением WAV-файлов на Android с использованием `QMediaPlayer` и `QBuffer` может иметь несколько причин:

1. **Формат WAV**: Убедитесь, что WAV-файл соответствует требованиям Android. Некоторые кодеки и форматы заголовков WAV могут не поддерживаться платформой. Попробуйте преобразовать файлы в другой формат (например, PCM 16-bit, 44.1 kHz), который более совместим с Android.

2. **Использование `QBuffer`**: На Android могут быть особенности в работе с `QBuffer`. Попробуйте использовать `QIODevice` или создать `QFile` из в памяти загруженного массива, чтобы убедиться, что он корректно считывается:

    ```cpp
    QFile file(buffer);
    if (!file.open(QIODevice::ReadOnly))
    {
        qWarning() << "Cannot open buffer as QFile";
        return; // Обработка ошибки
    }
    m_channel[a1]->setSourceDevice(&file);
    ```

    Мы не можем напрямую передать `QBuffer`, так как `QMediaPlayer` ожидает источник, который поддерживает определённый интерфейс. Подумайте о реализации промежуточного класса, наследуемого от `QIODevice`.

3. **Проверка состояния звукового устройства**: Убедитесь, что у вас установлены правильные параметры для `QAudioOutput`. Используйте `m_audioOutput[a1]->setVolume(1.0);` для установки громкости и проверьте, не установлено ли значение на 0.

4. **Логирование**: На Android полезно добавить логирование для отслеживания состояний медиаплеера. Например, слушайте сигналы `stateChanged` и `mediaStatusChanged`, чтобы проверить, правильно ли обрабатываются состояния:

    ```cpp
    connect(m_channel[a1], &QMediaPlayer::stateChanged, this, [](QMediaPlayer::PlaybackState state) {
        qDebug() << "State changed:" << state;
    });
    connect(m_channel[a1], &QMediaPlayer::mediaStatusChanged, this, [](QMediaPlayer::MediaStatus status) {
        qDebug() << "Media status changed:" << status;
    });
    ```

5. **Отладка на Android**: Используйте Android Studio и `adb logcat` для сбора информации о возможных ошибках, которые могут быть выведены при попытке воспроизведения. Возможно, вы получите полезные сообщения об ошибках.

6. **Использование альтернатив**: Если проблема сохраняется, возможно, стоит рассмотреть использование `QSoundEffect` для более простых звуковых эффектов. Он лучше подходит для небольших аудиофайлов и может избежать некоторых из сложностей, связанных с `QMediaPlayer`.

Попробуйте предложенные решения, и это может помочь найти причину проблемы и исправить её.
Похожие вопросы