检查 Qt6 是否支持给定文件的音频格式

问题描述 投票:0回答:1

QtMultimedia 在 Qt5 和 Qt6 之间发生了很多变化。 通过QMediaFormat::supportedAudioCodecs,我们可以得到系统支持的QMediaFormat::AudioCodec列表。

现在我们应该获取给定文件使用的 QMediaFormat::AudioCodec。

为此,似乎可以使用 QMediaPlayer::metaData 但不幸的是,在我测试的所有文件上,元数据不包含 QMediaFormat::AudioCodec 或者我不知道如何检索此值。在Qt5中,看起来QMediaContent适合获取媒体信息,但在Qt6中已被删除。

qt qt6 qtmultimedia qmediaplayer
1个回答
0
投票

Qt 中存在问题,已在 Qt 6.5.0 和 FFmpeg 的使用中修复。

这是我实现验证功能的方法:

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"));

文件加载后必须验证编解码器,否则检测可能不正确。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.