سؤال

أنا حاليًا في عملية نقل تطبيق C# الخاص بي إلى QT / C ++. أنا أواجه مشاكل بأطوال من 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#.

أي أفكار موضع تقدير. شكرًا.

هل لدى أي شخص أي أفكار أخرى قبل انتهاء المكافأة؟

هل كانت مفيدة؟

المحلول

مرحبًا ، هناك تصحيح إلى taglib يحسب الطول بالمللي ثانية ، وأضاف هذا الرجل طريقة (طول milliseconds ()) التي تُرجع الطول بالمللي ثانية ، وربما يكون ذلك مفيدًا لك:http://web.archiveorange.com/archive/v/sf3pjr01lsqjsqjrac7l

نصائح أخرى

لقد تغير الكثير في تحليل ملفات الصوت Taglib#لأنه تم نقله في الأصل ، لذلك من الصعب تحديد أين سيحدث الفرق بالضبط. يمكنك التحقق من برنامج C ++ الخاص بك لرسائل التصحيح.

أظن أن الفرق هو في كيفية تفاعل المكتبتين مع الرؤوس غير الصالحة. يبدو أنه إذا كان رأس الإطار الأول الذي يجده غير صالح ، فلن يحسب Taglib أي قيم خاصية صوتية. Taglib#، من ناحية أخرى ، يبحث عن أول رأس صالح في أول 16 كيلوغرام من الجزء الصوتي من الملف. إذا كان الرأس الأول الذي يواجهه فاسدًا ، فسيقوم بمسح الرأس التالي. إذا كنت أتذكر بشكل صحيح ، فقد تؤدي علامة ID3V2 المحفوظة بشكل غير صحيح إلى ظهور 0xff ff ff في بداية قسم الصوت من الملف. هذا من شأنه أن يؤدي إلى نوع الفشل الموضح أعلاه.

المشكلة هي في السطر 166 من taglib/mpeg/mpegproperties.cpp. يمكن حل هذا باستخدام نفس النهج مثل الخطوط 171 إلى 191 ، ولكنك ترغب في تحديث الكود للتخلي عنه بعد نقطة في حالة عدم وجود ملف MP3.

اعتبارًا من كتابة هذه السطور ، يدعم Taglib 1.11 Beta 2 الحصول على طول الصوت بالمللي ثانية. يمكنك القيام بذلك مع الكود التالي:

TagLib::FileRef f(path);
int lengthInMillis = f.audioProperties()->lengthInMilliseconds();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top