تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[مثال] تحويل الفيديوهات باستخدام حزمة xFFmpeg.NET
#1
Video 
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته 

الموضوع بلغة VB.NET

هذا مثال لاستخدام حزمة xFFmpeg.NET الخاصة بالتعامل مع الفيديوهات

الحزمة ما هي الى غطاء Wrapper للتعامل مع ملف FFmpeg.exe الشهير الذي يمكنه عمل كل شيء بالفيديوهات تقريبا
في الحقيقة يمكنك تحويل الفيديوهات عن طريق FFmpeg.exe مباشرة ، ولكن التعامل لن يكون بالبساطة المطلوبة ، كنت طرحت في المنتدى القديم استخدام FFmpeg.exe مباشرة عن طريق Shell .

xFFmpeg.NET تجعل التعامل مع الفيديوهات اسهل ما يمكن ، فهي تمكنك من تحويل الفيديوهات والصوتيات بجميع صيغها تقريبا وكذلك قصها او تعديل اعداداتها.

تحتاج لتنزيل FFmpeg.exe من موقعهم الرسمي ، بعد ذلك قم بفك الضغط وستجد ملف  FFmpeg.exe داخل مجلد bin
 
انسخ FFmpeg.exe الى مجلد bin\Debug في ملفات المشروع وسيعمل ان شاء الله تعالى

   
   
   
   

المثال:

.zip   FFmpegEx.zip (الحجم : 122.9 ك ب / التحميلات : 44)  
الذي اقدمه لكم في غاية البساطة ، تقوم باختيار الملف المراد تحويله ووكذلك مسار واسم حفظه ثم اضغط حوّل وفقط 
شاهد تقدم عملية التحويل وكذلك معلومات اثناء التحويل
تقبل الله منا ومنكم الطاعات
في المشاركة التالية سأعلق بعض الشيء على الكود واشرح كيفيه اضافة الحزمة xFFmpeg.NET و التعامل معها


لتثبيت حزمة xFFmpeg.NET في مشروعك قم بالتالي :


   
   


الان وقد تم اضافة الحزمة لمشروعك ، اقم باستيراد مجالات الاسماء التالية : 


كود :
using FFmpeg.NET;

using FFmpeg.NET.Events;
using System.IO;


الان كل ما عليك فعله عند الحاجة للتعامل مع الحزمة هو انشاء الكائنات التالية 


كود :
            var inputFile = new MediaFile(TxtSrc.Text); //الملف المدخل
            var outputFile = new MediaFile(TxtDist.Text); //[size=small][font=Monaco, Consolas, Courier, monospace]الملف النتيجة[/font][/size]
            var ffmpeg = new Engine(FFmpegPath);//كائن التعامل مع الفيديو


الكائن من النوع MediaFile يمثل ملف مدخل او مخرج
الكائن من النوع Engine هو المهم في هذه الحزمة التي يتم التعامل من خلاله مع الملفات

يمكنك ايضا انشاء كائن من نوع ConversionOptions  وتمريره الى كائن ffmpeg اذا اردت تعديل اعدادات الفديدو وهو امر اختياري

الآن يمكنك اسناد الاحداث للكائن ffmpeg للاجراءات التي تقوم بتنفيذها :

كود :
            ffmpeg.Progress += (s,ev)=> SetProgress(ev);
            ffmpeg.Complete += OnComplete;
            ffmpeg.Error += OnError;

OnError و OnComplete هم اجراءات عادية يتم استدعائها عند اكتمال العملية او عند حدوث خطأ
اما SetProgress فهو اجراء يقوم باستدعاء اجراء مفوض للحدث تقدم عمليه التحويل 
لان عمليه التحويل تتم في Thread اخر ، لذلك فلا يمكننا اسناد حدث تقدم التحويل الى اجراء بدون تفويض ،

الان السطر التالي هو الذي يقوم بامر التحويل : 

كود :
            await ffmpeg.ConvertAsync(inputFile, outputFile);

ولان عمليه التحويل بشكل غير متزامن يجب ان نستخدم الكلمة Await عند استدعاء امر التحويل ، ويجب ايضا استخدام الكلمة Async في تعريف الاجراء الذي يتم استدعائها فيه :
كود :
        private async void BtnAction_Click(object sender, EventArgs e)

الان قم بتعريف الاجراءات التي يتم استدعائها بالاحداث:

كود :
            //حدث اكتمال التحويل
        private void OnComplete(object sender, ConversionCompleteEventArgs e)
        {
            MessageBox.Show("تم التحويل بنجاح");
        }

كود :
        //حدث عند حدوث خطأ في التحويل
        private void OnError(object sender, ConversionErrorEventArgs e)
        {
            MessageBox.Show($"حدث خطأ أثناء التحويل {e.Exception.ExitCode} : \n {e.Exception.Message}");
        }

اما عند كيفية استخدام الاجراء المفوض للتعامل مع حدث تقدم عملية التحميل :

كود :
           delegate void SetProgressCB(ConversionProgressEventArgs ev);
        void SetProgress(ConversionProgressEventArgs ev)
        { 
            if (this.progressBar1.InvokeRequired)
                Invoke(new SetProgressCB(SetProgress), ev);
            else
                OnProgress(ev);
        }

يقوم الاجراء السابق باستدعاء OnProgress الآن يمكنك التعامل مع OnProgress كأنها حدث تقدم عمليه التحويل :

كود :
        private void OnProgress(ConversionProgressEventArgs e)
        {
            LblFrame.Text = $"إطار : {e.Frame}";
            LblFps.Text = $"{e.Fps} إطار/ث";
            LblBit.Text = $"{e.Bitrate} بت/ث";
            LblTime.Text = $"{e.ProcessedDuration.TotalSeconds:N2}/{e.TotalDuration.TotalSeconds:N2} ث";
            LblSize.Text = $"الحجم : " + (e.SizeKb < 1024 ? e.SizeKb + " ك.ب." : $"{e.SizeKb / 1024.0:N2}  م.ب.");
            progressBar1.Maximum = (int)e.TotalDuration.TotalSeconds;
            progressBar1.Value = (int)e.ProcessedDuration.TotalSeconds;

        }

الامر بهذه البساطة فعلا.

انصحكم بزيارة صفحتهم على GitHub هناك امثلة شارحة لكيفية الاستخدام اكثر:
https://github.com/cmxl/FFmpeg.NET

اذا كان هناك امر غير واضح انا جاهز تماما للرد على اسألتكم ان شاء الله تعالى
السلام عليكم ورحمة الله وبركاته
الرد }}}



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم