4

Qtアプリケーションでtaglibライブラリ(1.7.2)を使用して、音楽フォルダからmp3ファイルのメタデータを読み取ります。問題は、それが非常に遅いことです。

たとえば、これは次のコードです。

QString path = "C:/Music/";
QDir d(path);
QStringList fileTypes;
fileTypes << "*.mp3" ;
d.setNameFilters(fileTypes);
QStringList pathList = d.entryList( QDir::NoDotAndDotDot | QDir::Files);

QTime t;
t.start();
foreach (QString fileName, pathList) {
    fileName = path + fileName;
    TagLib::FileRef *f = new TagLib::FileRef(fileName.toStdWString().c_str());
}
qDebug()<<t.elapsed();

このコードは、400曲を含むフォルダーをロードするのに約11秒かかります。つまり、ファイルごとに約28ミリ秒かかります。これは非常に遅いラインです:

TagLib::FileRef *f = new TagLib::FileRef(pathFile.toStdWString().c_str());

こんなに長いのは普通ですか?マルチスレッドを使用してみましたが、何も変更されません。また、十分に強力であるため、PCからは取得されません。奇妙なことに、すべてのファイルが読み込まれると、次にフォルダを再度読み込むときに、(OSを再起動するまで)瞬時に実行されます。


私も別の問題があります。

タグが設定されていない場合、アプリがクラッシュして次のように出力されることがあります。

HEAP[myapp.exe]: 
Invalid address specified to RtlFreeHeap( 0ED90000, 0ED92CC0 )

たとえば、次の行にあります。

if (!f->tag()->genre().isNull())

私はWindows7を使用しています。

ありがとう。

4

1 に答える 1

3

タグが設定されていない場合、アプリがクラッシュして出力することがあります...

これは、TagLibにおける多くの奇妙な設計上の決定の1つです。タグがない場合、AudioPropertiesオブジェクトはNULLです。あなたはそれと一緒に暮らし、NULLをチェックするためにいくつかのコードを追加する必要があります。

奇妙なことに、すべてのファイルが読み込まれると、次にフォルダを再度読み込むときに、瞬時に実行されます(OSを再起動するまで)

Windows7には非常に高度で非常に積極的なディスクI/Oキャッシュメカニズムがあるため、これは奇妙なことではありません。ファイルに「触れる」と、RAMに到達し、次にアクセスするときに、ほぼ瞬時に実行されます。400 mp3ファイルはそれほど多くなく、すべてRAMに収まります。

400曲を含むフォルダをロードするための11秒

通常のハードディスクドライブでは通常9〜11ミリ秒かかるディスクシークを400回実行する必要があります(はい、SSDの場合はわずか0.1ミリ秒です)。したがって、フォルダが断片化されている場合は、ドライブのヘッドを「巻き戻す」ために少なくとも10 * 400=4秒かかります。id3タグはファイルの最初と最後に発生する可能性があるため、これにより読み取り回数が実質的に2倍になり(ファイルの最後まで巻き戻す必要があります)、2倍の時間(約8秒)が得られます。

履歴書:フォルダを読み取る時間は、現実的なものに近いものです。TagLibにはいくつかの癖があります(NULLや、アーカイブからの読み取りなど、ファイル操作をオーバーロードして許可できないなど)が、回避できます。TagLibの機能は本当に優れており、多くの面でユニークです(幅広いフォーマットのサポート)。

于 2012-07-01T19:50:30.713 に答える