4

現在、C# アプリケーションを Qt / C++ に移行中です。TagLib からの長さに問題が発生しています。TagLib# がオーディオの長さをミリ秒単位で返すのに対し、TagLib はその (間違った) 持続時間を秒単位で返すのは奇妙だと思います。TagLib は長さの値に対してゼロを返すだけですが、TagLib# は正しいままです。

ここにC#/ TagLib#の私のソースがあります...

TagLib.File tagfile = TagLib.File.Create(path);
uint milliseconds = (uint)tagfile.Properties.Duration.TotalMilliseconds;

そして、これは C++ / TagLib でほぼ同等であるべきものです。私はそれを正確に読むように強制さえしました。失敗。

TagLib::FileName fn(path);
TagLib::FileRef fr(fn, true, TagLib::AudioProperties::Accurate);
uint length = fr.audioProperties()->length();

ほとんどのメディア ファイルで期待どおりに動作します。ただし、オーディオ プロパティを返さないオーディオ ファイルがいくつかあります (残りのタグ情報は問題なく読み取れます)。TagLib# では、まったく同じオーディオ プロパティが問題なく返されます。

どんなアイデアでも大歓迎です。ありがとう。

バウンティが終了する前に、他にアイデアはありますか?

4

3 に答える 3

6

こんにちは、ミリ秒単位で長さを計算する taglib へのパッチがあります。この男は、ミリ秒単位で長さを返すメソッド (lengthMilliseconds()) を追加しました 。 /v/sF3Pjr01lSQjsqjrAC7L

于 2010-12-02T20:18:24.493 に答える
3

TagLib# のオーディオ ファイルの解析は、最初に移植されて以来、多くの変更が加えられているため、違いがどこで発生するかを正確に言うのは困難です。C++ プログラムでデバッグ メッセージを確認できます。

私の推測では、違いは 2 つのライブラリが無効なヘッダーにどのように反応するかということです。最初に見つかったフレーム ヘッダーが無効な場合、TagLib はオーディオ プロパティの値を計算しないようです。一方、TagLib# は、ファイルのオーディオ部分の最初の 16KiB で最初の有効なヘッダーを探します。検出した最初のヘッダーが破損している場合、次のヘッダーをスキャンします。私の記憶が正しければ、ID3v2 タグが正しく保存されていないと、ファイルのオーディオ セクションの先頭に 0xFF FF FF FF が表示される可能性があります。これにより、上記のタイプの障害が発生します。

問題は、taglib/mpeg/mpegproperties.cpp の 166 行にあります。これは、171 行目から 191 行目と同じアプローチを使用して解決できますが、実際には MP3 ファイルではない場合に備えて、ある時点であきらめるようにコードを更新する必要があります。

于 2011-07-24T16:13:59.807 に答える
1

これを書いている時点で、TagLib 1.11 BETA 2 はオーディオの長さをミリ秒単位で取得することをネイティブにサポートしています。次のコードを使用してこれを行うことができます。

TagLib::FileRef f(path);
int lengthInMillis = f.audioProperties()->lengthInMilliseconds();
于 2016-11-16T02:59:27.767 に答える