我想制作一个音乐播放器,我希望在开场时过滤掉不是音频文件的文件 我应该使用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有关吗?
答案 0 :(得分:0)
关于如何检查文件中的音频格式而不检查其后缀,有一个工具名称mediainfo,命令行工具运行如下:
mediainfo -f [filepath]
您将获得有关该文件的完整信息,包括视频和音频(如果存在)。在这些参数中,“音频”类别下有一个“格式”值,表示内部的实际音频格式。例如。 AAC / AC3
关于文件可以在名称更改后播放,我认为文件名中可能有一些空格字符,或者播放器无法访问名称指定的文件。
答案 1 :(得分:0)
对于播放非简单,未压缩音频的媒体或音频文件,您可以使用
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
}
关于打开文件时遇到的错误代码:
\
个字符(如果您有一些字符,请使用其他\
进行转义)