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

标签 c++ qt audio

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

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

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

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

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

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 Splitter有关吗?

最佳答案

来自 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();

要验证编解码器是否受支持,您可以使用QMediaPlayer 类的error() 方法,它会返回一个错误代码(参见documentation ).

因此,在调用 setMedia() 之后,您可以执行如下操作:

if (player->error() == QMediaPlayer::FormatError)
{
    // Codec/format unsupported
}

关于打开文件时出现的错误代码:

  • 检查你的路径中没有\字符(如果有,用另一个\转义)
  • 检查是否有空格、特殊字符等。

关于c++ - 我怎么知道音频文件的格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45809685/

相关文章:

c++ - “T”未在此范围内声明

python - Ubuntu 16.10 上的 Anki 错误

c# - 将音频信号从内存流分别拆分为帧。字节数组 [C#]

c++ - 我的进程(应用程序)的并行实例数

c++ - 我在哪里可以找到一个好的 boost 引用?

qt - 如何在 `boost::filesystem::path` 和 `QString` 之间转换?

c++ - 如何不在其他机器(x86_64 Linux)上运行 Pi 特定代码?

javascript - Firefox (34.0.5) 中存在问题的音频可视化器 || Firefox 和 Web Audio API 的问题

ipod-touch - 是否可以关闭iPod touch上的所有声音?

c++ - 关于在模板中使用可变参数的逻辑运算符