03-08-20, 12:22 PM
(آخر تعديل لهذه المشاركة : 03-08-20, 02:03 PM {2} بواسطة Anas Mahmoud.)
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
الموضوع بلغة C#
هذا مثال لاستخدام حزمة xFFmpeg.NET الخاصة بالتعامل مع الفيديوهات
الحزمة ما هي الى غطاء Wrapper للتعامل مع ملف FFmpeg.exe الشهير الذي يمكنه عمل كل شيء بالفيديوهات تقريبا
في الحقيقة يمكنك تحويل الفيديوهات عن طريق FFmpeg.exe مباشرة ، ولكن التعامل لن يكون بالبساطة المطلوبة ، كنت طرحت في المنتدى القديم استخدام FFmpeg.exe مباشرة عن طريق Shell .
xFFmpeg.NET تجعل التعامل مع الفيديوهات اسهل ما يمكن ، فهي تمكنك من تحويل الفيديوهات والصوتيات بجميع صيغها تقريبا وكذلك قصها او تعديل اعداداتها.
تحتاج لتنزيل FFmpeg.exe من موقعهم الرسمي ، بعد ذلك قم بفك الضغط وستجد ملف FFmpeg.exe داخل مجلد bin
انسخ FFmpeg.exe الى مجلد bin\Debug في ملفات المشروع وسيعمل ان شاء الله تعالى
المثال:
FFmpegExVB.zip (الحجم : 147.1 ك ب / التحميلات : 38)
الذي اقدمه لكم في غاية البساطة ، تقوم باختيار الملف المراد تحويله ووكذلك مسار واسم حفظه ثم اضغط حوّل وفقط
شاهد تقدم عملية التحويل وكذلك معلومات اثناء التحويل
تقبل الله منا ومنكم الطاعات
في المشاركة التالية سأعلق بعض الشيء على الكود واشرح كيفيه اضافة الحزمة xFFmpeg.NET و التعامل معها
لتثبيت حزمة xFFmpeg.NET في مشروعك قم بالتالي :
الان وقد تم اضافة الحزمة لمشروعك ، اقم باستيراد مجالات الاسماء التالية :
الان كل ما عليك فعله عند الحاجة للتعامل مع الحزمة هو انشاء الكائنات التالية
الكائن من النوع MediaFile يمثل ملف مدخل او مخرج
الكائن من النوع Engine هو المهم في هذه الحزمة التي يتم التعامل من خلاله مع الملفات
يمكنك ايضا انشاء كائن من نوع ConversionOptions وتمريره الى كائن ffmpeg اذا اردت تعديل اعدادات الفديدو وهو امر اختياري
الآن يمكنك اسناد الاحداث للكائن ffmpeg للاجراءات التي تقوم بتنفيذها :
OnError و OnComplete هم اجراءات عادية يتم استدعائها عند اكتمال العملية او عند حدوث خطأ
اما SetProgress فهو اجراء يقوم باستدعاء اجراء مفوض للحدث تقدم عمليه التحويل
لان عمليه التحويل تتم في Thread اخر ، لذلك فلا يمكننا اسناد حدث تقدم التحويل الى اجراء بدون تفويض ،
الان السطر التالي هو الذي يقوم بامر التحويل :
ولان عمليه التحويل بشكل غير متزامن يجب ان نستخدم الكلمة Await عند استدعاء امر التحويل ، ويجب ايضا استخدام الكلمة Async في تعريف الاجراء الذي يتم استدعائها فيه :
الان قم بتعريف الاجراءات التي يتم استدعائها بالاحداث:
اما عند كيفية استخدام الاجراء المفوض للتعامل مع حدث تقدم عملية التحميل :
يقوم الاجراء السابق باستدعاء OnProgress الآن يمكنك التعامل مع OnProgress كأنها حدث تقدم عمليه التحويل :
الامر بهذه البساطة فعلا.
انصحكم بزيارة صفحتهم على GitHub هناك امثلة شارحة لكيفية الاستخدام اكثر:
https://github.com/cmxl/FFmpeg.NET
اذا كان هناك امر غير واضح انا جاهز تماما للرد على اسألتكم ان شاء الله تعالى
السلام عليكم ورحمة الله وبركاته
السلام عليكم ورحمة الله وبركاته
الموضوع بلغة C#
هذا مثال لاستخدام حزمة xFFmpeg.NET الخاصة بالتعامل مع الفيديوهات
الحزمة ما هي الى غطاء Wrapper للتعامل مع ملف FFmpeg.exe الشهير الذي يمكنه عمل كل شيء بالفيديوهات تقريبا
في الحقيقة يمكنك تحويل الفيديوهات عن طريق FFmpeg.exe مباشرة ، ولكن التعامل لن يكون بالبساطة المطلوبة ، كنت طرحت في المنتدى القديم استخدام FFmpeg.exe مباشرة عن طريق Shell .
xFFmpeg.NET تجعل التعامل مع الفيديوهات اسهل ما يمكن ، فهي تمكنك من تحويل الفيديوهات والصوتيات بجميع صيغها تقريبا وكذلك قصها او تعديل اعداداتها.
تحتاج لتنزيل FFmpeg.exe من موقعهم الرسمي ، بعد ذلك قم بفك الضغط وستجد ملف FFmpeg.exe داخل مجلد bin
انسخ FFmpeg.exe الى مجلد bin\Debug في ملفات المشروع وسيعمل ان شاء الله تعالى
المثال:
FFmpegExVB.zip (الحجم : 147.1 ك ب / التحميلات : 38)
الذي اقدمه لكم في غاية البساطة ، تقوم باختيار الملف المراد تحويله ووكذلك مسار واسم حفظه ثم اضغط حوّل وفقط
شاهد تقدم عملية التحويل وكذلك معلومات اثناء التحويل
تقبل الله منا ومنكم الطاعات
في المشاركة التالية سأعلق بعض الشيء على الكود واشرح كيفيه اضافة الحزمة xFFmpeg.NET و التعامل معها
لتثبيت حزمة xFFmpeg.NET في مشروعك قم بالتالي :
الان وقد تم اضافة الحزمة لمشروعك ، اقم باستيراد مجالات الاسماء التالية :
كود :
Imports FFmpeg.NET
Imports FFmpeg.NET.Events
Imports System.IO
الان كل ما عليك فعله عند الحاجة للتعامل مع الحزمة هو انشاء الكائنات التالية
كود :
Dim inputFile As New MediaFile(TxtSrc.Text) 'الملف المدخل
Dim outputFile As New MediaFile(TxtDist.Text)'الملف النتيجة
Dim ffmpeg As New Engine(FFmpegPath)'كائن التعامل مع الفيديو
الكائن من النوع MediaFile يمثل ملف مدخل او مخرج
الكائن من النوع Engine هو المهم في هذه الحزمة التي يتم التعامل من خلاله مع الملفات
يمكنك ايضا انشاء كائن من نوع ConversionOptions وتمريره الى كائن ffmpeg اذا اردت تعديل اعدادات الفديدو وهو امر اختياري
الآن يمكنك اسناد الاحداث للكائن ffmpeg للاجراءات التي تقوم بتنفيذها :
كود :
AddHandler ffmpeg.Progress, Sub(s, ev) SetProgress(ev)
AddHandler ffmpeg.Complete, AddressOf OnComplete
AddHandler ffmpeg.[Error], AddressOf OnError
OnError و OnComplete هم اجراءات عادية يتم استدعائها عند اكتمال العملية او عند حدوث خطأ
اما SetProgress فهو اجراء يقوم باستدعاء اجراء مفوض للحدث تقدم عمليه التحويل
لان عمليه التحويل تتم في Thread اخر ، لذلك فلا يمكننا اسناد حدث تقدم التحويل الى اجراء بدون تفويض ،
الان السطر التالي هو الذي يقوم بامر التحويل :
كود :
Await ffmpeg.ConvertAsync(inputFile, outputFile)
ولان عمليه التحويل بشكل غير متزامن يجب ان نستخدم الكلمة Await عند استدعاء امر التحويل ، ويجب ايضا استخدام الكلمة Async في تعريف الاجراء الذي يتم استدعائها فيه :
كود :
Private Async Sub BtnAction_Click(sender As Object, e As EventArgs) Handles BtnAction.Click
الان قم بتعريف الاجراءات التي يتم استدعائها بالاحداث:
كود :
'حدث اكتمال التحويل
Private Sub OnComplete(ByVal sender As Object, ByVal e As ConversionCompleteEventArgs)
MessageBox.Show("تم التحويل بنجاح")
End Sub
كود :
'حدث عند حدوث خطأ في التحويل
Private Sub OnError(ByVal sender As Object, ByVal e As ConversionErrorEventArgs)
MessageBox.Show($"حدث خطأ أثناء التحويل {e.Exception.ExitCode} : \n {e.Exception.Message}")
End Sub
اما عند كيفية استخدام الاجراء المفوض للتعامل مع حدث تقدم عملية التحميل :
كود :
Delegate Sub SetProgressCB(ByVal ev As ConversionProgressEventArgs)
Private Sub SetProgress(ByVal ev As ConversionProgressEventArgs)
If Me.progressBar1.InvokeRequired Then
Invoke(New SetProgressCB(AddressOf SetProgress), ev)
Else
OnProgress(ev)
End If
End Sub
يقوم الاجراء السابق باستدعاء OnProgress الآن يمكنك التعامل مع OnProgress كأنها حدث تقدم عمليه التحويل :
كود :
Private Sub OnProgress(ByVal e As ConversionProgressEventArgs)
LblFrame.Text = $"إطار : {e.Frame}"
LblFps.Text = $"{e.Fps} إطار/ث"
LblBit.Text = $"{e.Bitrate} بت/ث"
LblTime.Text = $"{e.ProcessedDuration.TotalSeconds}/{e.TotalDuration.TotalSeconds} ث"
LblSize.Text = $"الحجم : " & (If(e.SizeKb < 1024, e.SizeKb & " ك.ب.", $"{e.SizeKb / 1024.0} م.ب."))
progressBar1.Maximum = CInt(e.TotalDuration.TotalSeconds)
progressBar1.Value = CInt(e.ProcessedDuration.TotalSeconds)
End Sub
الامر بهذه البساطة فعلا.
انصحكم بزيارة صفحتهم على GitHub هناك امثلة شارحة لكيفية الاستخدام اكثر:
https://github.com/cmxl/FFmpeg.NET
اذا كان هناك امر غير واضح انا جاهز تماما للرد على اسألتكم ان شاء الله تعالى
السلام عليكم ورحمة الله وبركاته