我如何知道音频文件的格式?

时间:2017-08-22 05:43:06

标签: c++ qt audio

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

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

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

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

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

  

DirectShowPlayerService :: doSetUrlSource:未解决的错误代码   0x80070002(?t?Χ????????????????????

但在我更改文件名后,可以打开它。

我应该如何修复我的音乐播放器,而不是逐个修复文件错误或不支持的格式?

我写了这段代码来检查我打开的文件是否是受支持的音频文件。

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”
  假
  没有错误   “musicplayer.exe”
  假
  没有错误   “musicplayer.ilk”
  假
  没有错误   “musicplayer.exe”
  假
  没有错误   “一首歌.mp3”
  假
  没有错误

但文件如何不是音频文件没有错误? 为什么音频文件的音频不可用?

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

顺便说一下,文件的不正确持续时间会以某种方式得到修复。它与LAV Splitter有关吗?

2 个答案:

答案 0 :(得分:0)

  1. 关于如何检查文件中的音频格式而不检查其后缀,有一个工具名称mediainfo,命令行工具运行如下:

    mediainfo -f [filepath]
    

    您将获得有关该文件的完整信息,包括视频和音频(如果存在)。在这些参数中,“音频”类别下有一个“格式”值,表示内部的实际音频格式。例如。 AAC / AC3

  2. 关于文件可以在名称更改后播放,我认为文件名中可能有一些空格字符,或者播放器无法访问名称指定的文件。

答案 1 :(得分:0)

来自Qt's documentation

  

对于播放非简单,未压缩音频的媒体或音频文件,您可以使用QMediaPlayer C ++类[...]支持的压缩音频格式取决于操作系统环境,以及媒体插件的内容用户可能已安装。

如何使用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
}

关于打开文件时遇到的错误代码:

  • 检查您的路径中是否有\个字符(如果您有一些字符,请使用其他\进行转义)
  • 检查您是否有空格,特殊字符等。