الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

طرقة عرف الصوت من ملف

مغلق
بدأه زائر في 5 ديسمبر 2001 · 12 رد · 1,187 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

قد يظن القارئ من العنوان أن المسألة سهلة وحلها استخدام مكون TMediaPlayer أو استخدام دوال API.

ولكن المقصود هو قراء الملف من نوع (wav أو mp3 فقط) بايتاً بايتاً وتمرير كل بايت على دالة لكي تحولها إلى صوت ويكون الناتج النهائي للصوت مثل الصوت الناتج عن عزف MediaPlayer للملف.

قد تتساءلون لماذا التعقيد والسبب في ذلك هو حاجتي لذلك في مشروع خاص.

#2

أتذكر أن هناك دالة تدعى Play في لغة QBasic تقوم بإصدار صوت على حسب السلسة التي تمررها لها فهل هناك دالة في لغة Pascal تقوم بعمل مشابه بذلك.

استطعت فك شيفرة الصور النقطية BMP للصور التي تقل أبعادها عن 255×255 نقطة ولكن إلى الآن لم أعمم الطريقة وأريد فك شيفرة Wav أو MP3 .

سؤال آخر كيف أستطيع قراءة ملف MP3 باستخدام API. (بدون تعقيد):D

#3

اخي العزيز,

ان المكون MediaPlayer

يستطيع التعامل مع جميع انواع الملفات الصوتية ,

AVI , MP3 ,MID ,Wav,Dat,Mpg

انا استخدم دلفي 5 وجربت جميع الانواع و اشتغل تمام ,

هدا برنامج بسيط جربه ,

من هنا

وبالنسبة لفك شفرة Wav عندي متال لها , لكن في الرد القادم ساضعه لك .

وشكرا

madi

#4

السلام عليكم

أشكرك لردك في الواقع لا أريد استخدام MediaPalyer وإنما أردت استخدام دالة مباشرة (بدون مكونات) حتى لا أتقيد بشكل المكون.

#5

السلام عليكم

بالنسبة لسؤالك عن الـ mp3 ربما قد يفيدك هذا

استخدم الدالة mciSendString وهي توجد في unit mmsystem

ويتم استخدامها بالشكل الاتي

var 
file_name:string;
//لتحديد اسم الملف يمكن استعمال Opendialog 
//  ينبغي التركيز في كتابة الاومر , لا تنسى المسافة (space) 
//Open
mciSendString(pchar('open '+pchar(file_name)+' alias mp3'),nil,0,0);
//Play
mciSendString('play mp3',nil,0,0);
//Pause
mciSendString('pause mp3',nil,0,0);
//Stop
//لست متاكدا من انه ينفذ بشكل صحيح
mciSendString('stop mp3 wait',nil,0,0);
//Close
mciSendString('close mp3',nil,0,0);
.....

هذا ما في ذاكرتي من اوامر , ان كان هناك اوامر أخرى ساعلمك .

بالنسبة لقراءة الملف بايتا بايتا ان وجدت ما يشير الى هذا الموضوع ان شاء الله اخبرك , وان وجدت - انت - ارجو وضعها هنا لنستفيد جميعا .

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#6

إن شاء الله

على العموم أريد الكود في مشروع خاص

#7

أولا شكرا لك أخي العزيز على كل كلمة جميلة قلتها بحقي و بحق أي عضو في منتدانا العزيز , وشكرا على اهتمامك ,

لقد وعدتك بطريقة لفك شفرة Wav File , أولا سأضع لك طريقة فك محتوياته ,

أولا عليك تعريف السجل التالي

[l]

  TWav = record



       k2: smallint;

       FormatType: smallint;

       Channels:smallint;

       SampleRate: smallint;

       AvgBytePerSec: smallint;

        BlockAligh:smallint;

       BitPreSec:smallint;



    end;



[/l]

و هو سجل خاص بخصائص Wav كما لاحظت ,

حيت أن smallint هو عدد صحيح قصير Short integer

أيضا السجل التالي خاص بالبيانات الموسيقية الحقيقية

[l]

 TDataWave = record



       Size :smallint;

       Data :Pchar;



   end;



[/l]

بإمكانك أن تضعهم كلهم داخل سجل واحد , لكن افضل أن تفصل البيانات عن الخصائص ,

قم بتعريف المتغيران التالين

[l]



var

  Form1: TForm1;

  SWave :TWav;

   DataWave: TDataWave;

[/l]

بعد أن تضع Memo1 و Memo2 على الفورم ,

نأتي إلى أهم جزء وهو الدالة التي سوف تقراء ملف Wav حرفا حرفا , وعندما تصل إلى جزء البيانات الموسيقية فسوف تقراءه بالكامل .

[l]

procedure  Tform1.LoadSoundExecute(FileName:string);

var

   pf :FILE;

    s:String;

    p:Boolean;

    ch :char;

    NumRead : Integer;



begin

    Memo1.Lines.Clear;

    Memo2.Lines.Clear;

    if(FileName<>'')then

     begin

     AssignFile(pf,FileName);



     Reset(pF,1);

      p:=true;

       BlockRead(pF,ch,sizeof(ch),NumRead);

       Memo1.Text:=Memo1.Text+ch;

      while(p)do

       begin

          while(ch<>'f')do

           begin

           BlockRead(pF,ch,sizeof(ch),NumRead);

             if(NumRead=0)then

               exit;

                         Memo1.Text:=Memo1.Text+ch;

           end;

           BlockRead(pF,ch,sizeof(ch),NumRead);

                           Memo1.Text:=Memo1.Text+ch;

           if(ch='m')then

             begin

              BlockRead(pF,ch,sizeof(ch),NumRead);

              if(NumRead=0)then

                exit;

                         Memo1.Text:=Memo1.Text+ch;

               if(ch='t')then

                begin

                 BlockRead(pF,ch,sizeof(ch),NumRead);

                  if(NumRead=0)then

                   exit;

                         Memo1.Text:=Memo1.Text+ch;

                  if(ch=' ')then

                   begin

                      BlockRead(pF,SWave,sizeof(SWave),NumRead);

                     Memo2.Lines.Clear;

              s:='Format := ';

              s:=s+inttostr(SWave.FormatType);

              Memo2.Lines.Add(s);



              s:='Channel := ';

              s:=s+inttostr(SWave.Channels);

              Memo2.Lines.Add(s);



              s:='SAmleR := ';

              s:=s+inttostr(SWave.SampleRate);

              Memo2.Lines.Add(s);



              s:='AVG := ';

              s:=s+inttostr(SWave.AvgBytePerSec);

              Memo2.Lines.Add(s);



              s:='Block := ';

              s:=s+inttostr(SWave.BlockAligh);

              Memo2.Lines.Add(s);



              s:='Bit := ';

              s:=s+inttostr(SWave.BitPreSec);

              Memo2.Lines.Add(s);



          BlockRead(pF,ch,sizeof(ch),NumRead);

              while(true)do

               begin

                  while(ch<>'d')do

                   begin

                      BlockRead(pF,ch,sizeof(ch),NumRead);

                     if(NumRead=0)then

                      exit;

                     end;

                   if(ch='d')then

                     begin

                   BlockRead(pF,ch,sizeof(ch),NumRead);

                    if(NumRead=0)then

                     exit;

                     if(ch='a')then

                         begin

                      BlockRead(pF,ch,sizeof(ch),NumRead);

                     if(NumRead=0)then

                      exit;

                        if(ch='t')then

                                begin

                 BlockRead(pF,ch,sizeof(ch),NumRead);

                  if(NumRead=0)then

                   exit;



                                  if(ch='a')then

                                    begin

                                           BlockRead(pF,datawave,sizeof(datawave),NumRead);

                                          if(NumRead=0)then

                                           exit;



                                         s:='Size := ';

                                      s:=s+inttostr(DataWave.Size);

                                      Memo2.Lines.Add(s);

                                      GetMem(DataWave.Data,DataWave.Size+10);

                                      BlockRead(pF,datawave.data,DataWave.Size,NumRead);

                                      if(NumRead=0)then

                                         exit;



                                        closeFile(pf);



                                exit;

                                     end

                                  end

                               end

                       end;

                end;

            end;

       end;

     end;

   end;



 end;

end;



[/l]

حيت أن FileName هو اسم الملف من نوع Wav .

آخي العزيز بدك تطول بالك مع البرنامج , وتحاول تتبعه خطوة خطوة باستخدام أوامر التتبع في دلفي , حتى تستطيع فهم خطوات هده الدالة .

وهناك جزء أخر , وهو يخص استخدام DirectX حتى تستطع الاستفادة من جزء البيانات الموسيقية و تستطيع إنتاج الصوت منها .

الحقيقة أني لا املك هدا الجزء , ولكن بادن الله ادا كنت تريده فسوف أحاول فيه لأجل عيونك و عيون أعضاء المنتدى الحبيب .

وشكرا

مــــMADIــــدي

#8

أشكرك أخي على اهتمامك وردك.

في الحقيقة أريد شق طريقي للاحتراف وهذا المنتدى هو الطريق

#9

عفواً هناك خطأ ظهر عندي وقت التنفيذ عند السطر

BlockRead(pF,datawave.data,DataWave.Size,NumRead);

رسالة الخطأ "I/O error 998"

أيضاً هناك طلب آخر إذا بالامكان الإجابة عنه

وهو كيف نستطيع قراءة الملفات من نوع mp3.

وشكراً لكل من ساهم في هذا الموضوع والمنتدى الجبار.

#10

استبدلت السطر السابق بالسطر التالي:

BlockRead(pF,ch,sizeof(ch),NumRead);

فزالت المشكلة إلا أنني لم أسمع صوتاً

فما المشكلة

#11

هده المشكلة تحدت احيانا لبعض أنواع ملفات wav , حاو أن تجرب بملفات أخر ى, دون أن تستبدل أي جملة , أما عن الصوت فقد أخبرتك أن الكو د السابق لا يصدر الصوت , بل فقط يقوم بفك محتويات الملفات WAv .

,و ان شا الله حكملك باقي الكود ,

وشكرا

#12

شكراً شكراً

#13

أخي العزيز جرب الكمبوننت التالية , ومعها متال توضيحي , توجد بها عدة ميزات رائعة خاصة عملية Record , فهي تتميز بامكانية تسجيل اي صوت داخل جهازك , يعنى حتى وانت فاتح برنامج WinAmp فسوف تسجل الصوت الناتج منه .

من هنا

اولا تحتاج الى تركيب الكمبوننت في دلفي اولا , تم افتح البرنامج التجريبي

وشكرا

مــــMADIــــدي

هذا الموضوع مغلق.

مواضيع مشابهة