Воспроизведение файла ulaw с QAudioOutput

#qt #audio

#qt #Аудио

Вопрос:

Я пытаюсь настроить простой рабочий пример для воспроизведения файла .raw, и звук кажется искаженным. Когда воспроизводится файл .raw, я все еще могу все разобрать, он просто довольно искажен, как при прослушивании радиостанции, выходящей за пределы диапазона.

 QString mResourcePath ="test.raw";
QFile audio_file(mResourcePath);
 if(audio_file.open(QIODevice::ReadOnly)) {
     audio_file.seek(4); // skip wav header
     QByteArray audio_data = audio_file.readAll();
     audio_file.close();

     QBuffer audio_buffer(amp;audio_data);
     audio_buffer.open(QIODevice::ReadOnly);
     qDebug() << audio_buffer.size();

     QAudioFormat format;

     format.setSampleSize(8);
     format.setSampleRate(8000);
     format.setChannelCount(1);
     format.setCodec("audio/pcm");
     format.setByteOrder(QAudioFormat::BigEndian);
     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(info, format);
     output.start(amp;audio_buffer);

     // ...then wait for the sound to finish
     QEventLoop loop;
     QObject::connect(amp;output, SIGNAL(stateChanged(QAudio::State)), amp;loop, SLOT(quit()));
     do {
        loop.exec();
     } while(output.state() == QAudio::ActiveState);
 }
  

Ответ №1:

Заголовок вашего вопроса указывает на то, что вы хотите воспроизвести аудио u-law, которое является логарифмическим PCM. Тем не менее, строка

 format.setCodec("audio/pcm");
  

инициализирует воспроизведение для линейного PCM. 2 возможных решения:

  1. Инициализируйте воспроизведение с помощью соответствующего лог-PCM-кодека. В документах сообщается, что QAudioDeviceInfo::supportedCodecs() вернет список поддерживаемых кодеков.
  2. Преобразование логарифмических выборок PCM в линейный PCM в режиме реального времени. Это довольно малозатратно и может быть выполнено с помощью таблицы поиска.

Комментарии:

1. Спасибо за ваш ответ!! Если я использую QAudioDeviceInfo::supportedCodecs() Я получаю только «audio / pcm» Я новичок в программировании, и я понятия не имею, как преобразовать образцы логарифмического PCM в линейный PCM в режиме реального времени. Можете ли вы дать мне подсказку. Спасибо!!

2. Этот исходный код может быть полезен: git.videolan.org/?p=ffmpeg.git ;a=большой двоичный объект;f=libavcodec/…

3. Есть ли у вас какие-либо идеи, как я могу воспроизвести преобразованные данные? Я попытался использовать QAudioOutput::start (), но я получаю «Недопустимое преобразование из qint16 {он же short int} в «IODevice» »

4. Я не разбираюсь в qt. Похоже, это должен быть отдельный вопрос о переполнении стека.