質問

現在、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();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top