كاتب الموضوع : أنس محمود
بسم الله الرحمن الرحيم
بسم الله الرحمن الرحيم
* عنوان الموضوع :- الجزء الثاني من مقال تحويل الفيديو في برامجك
* مستوي المقال :- مبتدأ إلى متوسط
* التقييم : ( متروك للقارئ )
- السلام عليكم ورحمة الله وبركاته أعضاء المنتدى الكرام ،،،
ذكرت في المقال الأول طريقة لتحويل الفيديو عن طريق إرسال معاملات معينة إلى الملف ffmpeg.exe ،
وكان مظهر المقال معقداً بعض الشيء ، وظهرت عدة مشاكل بخصوص المكتبة Convert.dll
لذلك كان لابد من أن أقوم بكتابة هذه السطور لتوضيح الأمر بعض الشيء .
(لذلك أريدك أن تنسى ما سبق وتركز معي فيما هو آت للفهم وليس الحفظ )
+ أولاً :- الفكرة التي اعتمدت عليها في تحويل ملفات الـ Media :-
ببساطة الفكرة هي الاعتماد على الملف ffmpeg.exe ، ( يعني هو الذي سيقوم بالتحويل وليس نحن ! ) ، فقط علينا أن نرسل له بعض المعاملات مع تشغيله ( تعلمون تشغيل الملفات بالدالة Shell() ) ، وهذه المعاملات تتضمن اسم الملف المدخل ( أو الملفات ، وستعرف لماذا لاحقاً ) ، وخصائص الملف المخرج ( الصوت والفيديو ) ، ثم اسم الملف المخرج ،
ــ ويمكنك معرفة كافة هذه المعاملات بالنقر المزدوج على الملف ffmpeg.exe ( لن تستطيع القراءة إلا لو كنت صاروخ !! ) لذلك قمت برفع ملف Txt بهذه المعاملات ،
* ومن تلك المعاملات ( يجب أن يُتبع كل معامل بمسافة " " وكذلك القيمة التي تليه ، تتبع بمسافة ) :-
كود :
-i "Short Path"==> لإدخال مسار الملف بالطريقة القصيرة ( لا أجد مانع من استخدام المسار الطويل ، ولكن للاحتياط فقط ) .
-y ==> للكتابة فوق الملف المخرج ( إن وُجد ).
-sameq==> ( لا أريد أن أترجمها إلى " استخدام نفس الميزة " ولكنها بالـ English 'Use Same Quality' ).
-an==> لإخفاء الصوت.
-vn==> لإخفاء الصورة ( الفيديو ) .
-b Number ==> لتحديد الـ Bit rate للفيديو .
-ab Number ==> لتحديد الـ Bit rate للصوت.
-r Number ==> لتحديد الـ Frame rate للفيديو.
-ar Number ==> لتحديد الـ Frame rate للصوت.
-ac 1 or 2 ==> لتحديد نوع الصوت ( 1 لـ Mono و 2 لـ Stereo ).
-s WidthxHight==> لتحديد الحجم مثل –s 800x600 .
-vcodec Codec Name==> لتحديد الـ codec للفيديو.
-acodec Codec Name==> لتحديد الـ codec للصوت.
-f Format==> لتحديد نسق التحويل.
-title "Title"==> لتحديد عنوان الفيديو.
-author "Author Name"==> لكتابة اسم المؤلف.
-copyright "Copy Right ©"==> لكتابة حقوق الطبع.
-comment "Comment"==> لكتابة تعليق عن الفيديو.
-album "Album name"==> لكتابة اسم الألبوم.
- وبعد كتابة ما تريده من المعاملات تقوم بكتابة مسار الملف الناتج بين علامتي "" .
_-_-_1. يمكنك تكرار المعامل –i أكثر من مرة ، فقد تكون بحاجة لدمج ملف فيديو بدون صوت ، بملف صوت ، فتكتب المعامل –i مرة لمسار الفيديو و مرة لمسار الصوت ، وهكذا ...
_-_-_2. للحصول على المسار القصير ( كما قلت للاحتياط فقط ، فيمكنك الاستغناء عن هذه الخطوة ) ، يمكنك ذلك عن طريق الدالة GetShortName() بعد تعريف الدوال التالية :-
كود :
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Function GetShortName(ByVal sLongFileName As String) As String
On Error Resume Next
Dim lRetVal As Long, sShortPathName As String, iLen As Integer
sShortPathName = Space(255)
iLen = sShortPathName.Length
lRetVal = GetShortPathName(sLongFileName, sShortPathName, iLen)
Return (sShortPathName) 'Left, lRetVal)
End Function
كود :
-i "C:\1.wav" -y "C:\1.mp3"
كود :
Shell("C:\ffmpeg.exe -i ""C:\1.wav"" -y ""C:\1.mp3""", _
AppWinStyle.MaximizedFocus, True)
تلاحظ فتح نافذة الملف ffmpeg.exe ثم تحويل الملف ثم غلق النافذة وكما قلت سابقا أنك بحاجة إلى أن تكون مثل الصاروخ حتى تتمكن من قراءة ما هو مكتوب !! ، ومع ذلك قد تكون بحاجة إلى قراءة ما يرجعه الملف ffmpeg.exe فقد تريد معرفة تقدم التحويل أو سبب المشكلة في حال ظهور مشكلة ، لذلك فإن الحل هو اللجوء للفئة DOS_Outputs .
+ الفئة DOS_Outputs :-
تقوم الدالة ExecuteCommand داخل الفئة DOS_Outputs بنفس عمل الدالةshell() تقريبا ، ولكنها تعيد قيمة من النوع String تمثل النص الذي يرجعه الملف الذي تقوم بارسال سطر الأوامر إليه ( في مثالنا ffmpeg.exe )،
حمل الفئة DOS_Outputs ثم قم بإضافتها من قائمة Project ==> Add Existing File
ولا تنس إضافة مرجع مجال الأسماء Microsoft.VisualBasic.Compatibility من Project ==> Add Reference ثم من تبويب .Net أختر مجال الأسماء ،
جرب مثلاً تحويل نفس الملف السابق ولكن بالدالة ExecuteCommand ، قم بإنشاء كائن جديد من الفئة ، ثم استدع الدالة وأرسل لها المعاملات السابقة ، واستقبل ناتج الدالة في MsgBox() مثلاً :-
كود :
Dim Video As New DOS_Outputs()
MsgBox(Video.ExecuteCommand("C:\ffmpeg.exe -i ""C:\1.wav"" -y ""C:\1.mp3"""))
تلاحظ ظهور رسالة MsgBox بحالة التحويل وما تم فيها من عمليات ،
شيء آخر يدفعك لاستخدام الفئة DOS_Outputs هو الحدث ReceiveOutputs الذي يطلق عند استقبال مخرجات من الملف ffmpeg.exe ، وتستقبل من هذا الحدث وسيطة تمثل النص الذي يعيده الملف ، فيمكنك عرضها مثلاًً في TextBox يبين تقدم العملية مثلا ، أو إظهار طبيعة المشكلة مثلاً :-
كود :
WithEvents Video As New DOS_Outputs()
Private Sub VideoOutputs_ReceiveOutputs(ByVal sender As Object, ByRef CommandOutputs As String)
Me.TextBox1.AppendText(CommandOutputs & vbCrLf)
End Sub
شيء آخر أردت توضيحه ، إذا استصعبت الطريقة السابقة في الحصول على سطر المعاملات اللازم إرساله إلى الملف ffmpeg.exe ، فإن الفئة AVC تسهل عليك ذلك ، حيث كل ما عليك هو إنشاء كائن جديد من الفئة مع إرسال مسار الملف ffmpeg.exe إلى مشيد هذه الفئة ، ثم إسناد الخصائص التي تريدها ، ثم استقبال سطر الأوامر من الدالة GetCommandLine() ،
حمل الفئة AVC ثم أضفها لمشروعك من قائمة Project ==> Add Existing File ،
ثم راقب معي ما يلي لتحويل الملف السابق باستخدام الفئة AVC :-
كود :
Dim Video As New DOS_Outputs()
Dim Line As New AVC("C:\ffmpeg.exe")
Line.SourceFile = "C:\1.wav"
Line.TargetFile = "C:\1.mp3"
Dim Cmd As String = Line.GetCommandLine(True)
MsgBox(Cmd) 'C:\ffmpeg.exe -i "C:\1.wav" -y "C:\1.mp3"
MsgBox(Video.ExecuteCommand(cmd))
إلى هنا تقريباً نصف الطريق في عملية تحويل الفيديو ،
بقي أن أنوه أنه أحيانا يمكنك الاكتفاء بتحديد الملف المدخل والمخرج ، دون باقي الخصائص ، على أن تترك الملف ffmpeg.exe يحددها تلقائياً ، بينما أحياناً عليك معرفة الخصائص اللازمة لكل نوع من أنواع الفيديو لتتمكن من التحويل إليه ، وهذه الخصائص يمكنك معرفتها من أي برنامج تحويل فيديو ( وأنا أفضل Total Video Converter )
وهذا مثال على ما قمنا بعمله ( تحويل ملف wav إلى mp3 ) ،
قم بكتابة سطر الأوامر ( أو اضغط على الزر"الحصول على سطر الأوامر من الفئة AVC" ) ثم اضغط على أحد الأزرار للتجربة ،
سأتركك تصمم ما يعجبك ، مادمت قد علمت الطريقة ،
ولا تحرمونا من إبداعاتكم
هذا كل شيء ،،
وبإذن الله أنا جاهز لأي سؤال ،،
ولكن أرجو عدم تعجل الإجابة ، نظراً لانشغالي بعض الوقت ،،
أخوكم / أنس محمود ،،