c++ - 我怎么知道音频文件的格式?

标签 c++ qt audio

我想做一个音乐播放器,我想在打开时过滤掉文件而不是音频文件。
我应该使用QAudioDecoder吗?
但是我用QAudioDecoder检查的每个文件都告诉我相同的编解码器“audio / pcm”。

QAudioDecoder decoder;
decoder.setSourceFilename(fileUrl.toLocalFile());
qDebug() << decoder.audioFormat().codec();

如何不仅仅检查文件名是否以“.mp3”或“.wav”结尾,从而知道Qt媒体播放器是否支持音频文件的格式?

而且我发现在音乐播放器上播放某些文件时长不正确。
但是,当我使用其他音乐播放器应用程序播放文件时,它会在其他音乐播放器上提供正确的持续时间。

或者我的应用无法播放某些文件,但其他可以。
控制台说:

DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80070002 (?t?Χ??????w?????C)



但更改文件名后,可以将其打开。

我该如何在音乐播放器上修复这些文件,而不是一一修复文件的可能错误或不受支持的格式?

我写了这段代码来检查我打开的文件是否是受支持的音频文件。
QMediaPlayer audioChecker;
audioChecker.setMedia(fileUrl);
qDebug() << audioChecker.media().canonicalUrl().fileName();
qDebug() << audioChecker.isAudioAvailable();
if(audioChecker.error() == QMediaPlayer::NoError) {
    qDebug() << "no error";
}
if(audioChecker.error() == QMediaPlayer::FormatError) {
    qDebug() << "format error";
}

无论测试什么文件,它都告诉我没有错误。

安慰:

"musicplayer.exe"
false
no error
"musicplayer.exe"
false
no error
"musicplayer.ilk"
false
no error
"musicplayer.exe"
false
no error
"a song.mp3"
false
no error



但是,没有音频文件的文件怎么会没有错误呢?
为什么音频文件的音频不可用?

没关系。我刚刚读到setMedia()立即返回,并且不等待媒体加载。因此这是正常的,因为没有加载,所以没有音频,也没有错误。
我想我将创建一个线程类来检查我的文件。

顺便说一句,文件的不正确的持续时间是固定的。它与LAV分离器有关吗?

最佳答案

Qt's documentation:

For playing media or audio files that are not simple, uncompressed audio, you can use the QMediaPlayer C++ class […] The compressed audio formats supported does depend on the operating system environment, and also what media plugins the user may have installed.



有关如何使用QMediaPlayer类的简单示例:
player = new QMediaPlayer;
// ...
player->setMedia(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3"));
player->setVolume(50);
player->play();

要验证是否支持编解码器,可以使用error()类的QMediaPlayer方法,该方法将返回一个错误代码(请参阅documentation)。

因此,在调用setMedia()之后,您可以执行以下操作:
if (player->error() == QMediaPlayer::FormatError)
{
    // Codec/format unsupported
}

关于打开文件时得到的错误代码:
  • 检查路径中是否没有\字符(如果有,请用另一个\进行转义)
  • 检查是否有空格,特殊字符等。
  • 关于c++ - 我怎么知道音频文件的格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45809685/

    相关文章:

    c++ - 在C++中除法后的奇怪结果

    c++ - 错误:无法将参数“1”的“std::string”转换为“X509 *”,而将参数“1”转换为“EVP_PKEY * X509_get_pubkey(X509 *)”

    c++ - HID 游戏 handle 报告描述符问题

    c++ - 如果使用 'this' 创建(新建)Qt 对象需要删除还是自动删除?

    audio - 解码 EVRC 语音编解码器

    android - OpenSL - 音频播放器对象搜索不佳

    C++:比较 if 语句中的十进制值

    c++ - 带有自定义阻止队列实现的未解析外部符号

    c++ - 在Qt中分配对象时处理异常

    audio - 如何在 OS X 上将 audio.m4a 转换为 audio.amr?