タグリブ#(C#)とタグリブ(C ++)の長さの違い
-
29-09-2019 - |
質問
現在、C#アプリケーションをQT / C ++に移動する過程にあります。タグリブからの長さの問題に遭遇しています。 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#で問題はありません。
どんなアイデアも感謝しています。ありがとう。
賞金が終わる前に、誰かがこれ以上アイデアを持っていますか?
解決
こんにちは、ミリ秒単位で長さを計算するタグリブへのパッチがあります。この男は、ミリ秒単位で長さを返す方法(長さ微小秒())を追加しました。http://web.archiveorange.com/archive/v/sf3pjr01lsqjsqjrac7l
他のヒント
Taglib#のオーディオファイルの解析は、元々移植されていたため、多くのことが変化したため、正確な違いがどこで発生するかを言うのは困難です。デバッグメッセージについては、C ++プログラムを確認できます。
私の推測では、2つのライブラリが無効なヘッダーにどのように反応するかに違いがあると思います。最初のフレームヘッダーが見つかった場合、タグリブはオーディオプロパティ値を計算しないようです。一方、Taglib#は、ファイルのオーディオ部分の最初の16kibで最初の有効なヘッダーを探します。遭遇する最初のヘッダーが破損している場合、次のヘッダーをスキャンします。正しく覚えていれば、ID3v2タグが誤って保存されていると、ファイルのオーディオセクションの先頭に0xff ff ff ffが表示される可能性があります。これにより、上記の障害のタイプがトリガーされます。
問題は、taglib/mpeg/mpegproperties.cppの166行です。これは、171〜191行目と同じアプローチを使用して解決できますが、実際にMP3ファイルではない場合に備えて、コードを更新してあきらめます。
この執筆時点で、Taglib 1.11 Beta 2は、ミリ秒単位でオーディオの長さをネイティブにサポートしています。次のコードでこれを行うことができます。
TagLib::FileRef f(path);
int lengthInMillis = f.audioProperties()->lengthInMilliseconds();