بحاجة إلى مساعدة في معالجة ملفات WAV (RIFF) على مستوى البايت

StackOverflow https://stackoverflow.com/questions/2618861

سؤال

أنا أكتب تطبيقًا في C# سيقوم بتسجيل ملفات الصوت (*.wav) ووضع علامة وتسميتها تلقائيًا. ملفات الموجة هي ملفات RIFF (مثل AVI) والتي يمكن أن تحتوي على أجزاء بيانات التعريف بالإضافة إلى قطع بيانات الموجة. حتى الآن أحاول معرفة كيفية قراءة وكتابة بيانات RIFF Meta من وإلى ملفات الموجة المسجلة.

أنا أستخدم Naudio لتسجيل الملفات ، وسألها منتدياتهم مثل حسنا على ذلك للطريقة لقراءة وكتابة علامات riff. بينما تلقيت عددًا من الإجابات الجيدة ، لم يسمح بأي من الحلول للقراءة و كتابة قطع ريف بنفس السهولة كما أريد.

ولكن الأهم من ذلك لدي خبرة قليلة للغاية في التعامل مع الملفات على مستوى البايت ، وأعتقد أن هذه قد تكون فرصة جيدة للتعلم. لذا ، أريد الآن أن أحاول كتابة صفي (ES) الذي يمكنه القراءة في ملف RIFF والسماح بقراءة بيانات التعريف ، وكتابتها من الملف.

لقد استخدمت التدفقات في C#، ولكن دائمًا مع الدفق بأكمله مرة واحدة. الآن أنا ضائع قليلاً لأنني يجب أن أفكر في بايت ملف بواسطة Byte. على وجه التحديد كيف يمكنني إزالة أو إدخال البايتات من وإلى منتصف ملف؟ لقد حاولت قراءة ملف من خلال filestream في مجموعة بايت (بايت []) كما هو موضح في الكود أدناه.

System.IO.FileStream waveFileStream = System.IO.File.OpenRead(@"C:\sound.wav");
byte[] waveBytes = new byte[waveFileStream.Length];
waveFileStream.Read(waveBytes, 0, waveBytes.Length);

ويمكنني أن أرى من خلال مصحح Visual Studio أن البايت الأربعة الأول هم رأس ريف للملف.alt text

لكن المصفوفات هي ألم للتعامل معها عند تنفيذ الإجراءات التي تغير حجمها مثل إدراج القيم أو إزالة القيم. لذلك كنت أفكر في أنني أستطيع بعد ذلك إلى البايت [] في قائمة كهذه.

List<byte> list = waveBytes.ToList<byte>();

مما يجعل أي معالجة للبايت بايت بايت أسهل بكثير ، لكنني قلق من أنني قد أفتقد شيئًا مثل فصل في النظام. هل أنا على المسار الصحيح ، أم أن هناك طريقة أفضل للقيام بذلك؟ يجب أن أذكر أيضًا أنني لست مهتمًا بشكل كبير بالأداء ، وأفضل عدم التعامل مع المؤشرات أو كتل الرموز غير الآمنة مثل هذا الشخص.

إذا كان يساعد على الإطلاق هنا مقال جيد على تنسيق ملف riff/wav.

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

المحلول

لم أكتب في C#، لكن يمكنني الإشارة إلى بعض الأماكن السيئة من وجهة نظري:

1) لا تقرأ ملفات WAV بالكامل في الذاكرة ما لم تكن الملفات ملفات خاصة بك ولديها حجم صغير عن قصد.

2) ليست هناك حاجة لإدراج بيانات في الذاكرة. يمكنك ببساطة القيام بذلك حول ما يلي: تحليل الملف المصدر ، وتخزين إزاحة القطع ، وقراءة البيانات الوصفية في الذاكرة ؛ تقديم البيانات الوصفية للتحرير في مربع حوار ؛ أثناء حفظ رأس الكتابة riff-wav ، فصنه ، قم بنقل بيانات الصوت من الملف المصدر (عن طريق القراءة والكتابة) ، إضافة بيانات التعريف ؛ تحديث رأس ريف واف.

3) حاول حفظ البيانات الوصفية في ذيل الملف. سيؤدي ذلك إلى التناوب فقط ، لن يتطلب العلامة إعادة كتابة ملف كامل.

يبدو أن بعض المصادر المتعلقة بالعمل مع ملفات RIFF في C# موجودة هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top