There have been many changes in QtMultimedia between Qt5 and Qt6. With QMediaFormat::supportedAudioCodecs, we get a list of QMediaFormat::AudioCodec supported by the system.
Now we should get the QMediaFormat::AudioCodec that is used by a given file.
For that, it seems possible to use QMediaPlayer::metaData but unfortunately, on all the files I tested, the metadata does not contain QMediaFormat::AudioCodec or I don't know how to retrieve this value. In Qt5, it looks QMediaContent was suitable to get media information but it has been removed in Qt6.
There was an issue in Qt that has been fixed in Qt 6.5.0 and the use of FFmpeg.
Here is how I have implemented a verification function:
bool isCodecSupported(QMediaFormat::AudioCodec fileCodec) const
{
// get supported audio codecs list
QMediaFormat mediaFormat;
const QList<QMediaFormat::AudioCodec> supportedAudioCodecs = mediaFormat.supportedAudioCodecs(QMediaFormat::Decode);
// check if file codec is supported by the system
return std::any_of(supportedAudioCodecs.constBegin(), supportedAudioCodecs.constEnd(), [&](QMediaFormat::AudioCodec systemCodec) {
return fileCodec == systemCodec; });
}
void checkCodec()
{
const QMediaMetaData fileMetadata = m_mediaPlayer->metaData();
const QMediaFormat::AudioCodec fileAudioCodec = fileMetadata.value(QMediaMetaData::AudioCodec).value<QMediaFormat::AudioCodec>();
if(!isCodecSupported(fileAudioCodec)) {
qWarning() << tr("%1 (%2) is not supported by your system. Please install this codec to be able to play a sound.")
.arg(QMediaFormat::audioCodecName(fileAudioCodec),
QMediaFormat::audioCodecDescription(fileAudioCodec));
}
}
m_mediaPlayer = new QMediaPlayer(this); // m_mediaPlayer is defined as a QMediaPlayer* in the header file
connect(m_mediaPlayer, &QMediaPlayer::mediaStatusChanged,
this, [this](QMediaPlayer::MediaStatus status) {
if(status == QMediaPlayer::LoadedMedia) {
checkCodec();
}
});
m_mediaPlayer->setSource(QUrl("qrc:/audio.wav"));
The codec has to be verified once the file is loaded, otherwise the detection may be incorrect.