المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : دمج ملفات صوتية فى ملف منفرد


ثامر أبو بلقيس
17-07-2015, 11:57 PM
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

بافتراض أن في مجلد الــ audio مثلا يوجد 286 ملفا صوتيا بصيغة
Mp3 تمثل آيات سورة البقرة كمثال من الآية 1 إلى غاية 286 بهذه التسميات

أردنا دمجها مع بعض لتصبح ملفا واحد لسورة البقرة أو دمج جزء منها يتحقق ذلك بتحديد قيمة البداية و النهاية
في دالة التكرار و التي يمكن استغلالها فيما بعد لتكرار الآيات بكل سهولة ما دام تم الحصول على الملف مجمعا
من ... الى.....
-------------------------------------------------------
سنعتمد على التعليمة os لكن سيعترضنا مشكل و هو الترتيب العددي فالملفات اذ كانت أقل من تسعة لن يحدث مشكل
لكن إذ تجاوز الـ 9 سيحدث دمج خاطئ
حيث سيدمج الملف 1 ثم 10 ...... الخ
--------------------------------------------
لذلك و قبل إجراء عملية الدمج نجري نقل و إعادة تسميات للملفات لتحقق دمجا مرتبا وذلك باستعمال الأرقام و الحروف وبعد إنهاء العملية
نحذف هذه الملفات الجديدة .
---------------------------------------------------------------
و بحكم أن التعليمة os سنوظفها للتعامل مع موجة أوامر وجب في مثل هكذا
مشاريع جعل البرنامج مسؤولا عدا الـ xp

الآن ضع ملفات صوتية في مجلد الـ audio ضف زرا في التجميعية
أكتب فيه :
---- مسح كل الملفات الصوتية وفق هذا المسار عند بدء عملية جديدة
File.Delete(_SourceFolder.."\\*.mp3", false, false, false, nil);
-------- البحث عن الملفات الصوتية في المجلد المشار اليه في المار
ter = File.Find(_SourceFolder.."\\AutoPlay\\Audio\\", "*.mp3", false, false, nil, nil);
---- دالة تكرارية تبدأ من 1 إلى غاية عدد الملفات الصوتية الموجودة في المجلد أعلاه
for b = 1,#ter do
-------- القيام بعملية نسخ الملفات الصوتية الى المسار الموجود في أول الأكواد
File.Copy(_SourceFolder.."\\AutoPlay\\Audio\\"..b..".mp3",_SourceFolder, true, true, false, true, nil);
------ يتم توزرع اعادة تسمية الملفات الصوتية بطريقة تخدم عملية الدمج المنتظم وفق الملفات الأصلية
if b<=9 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\1a"..b..".mp3");
elseif b>=10 and b<=19 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\2a"..b..".mp3");
elseif b>=20 and b<=29 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\3a"..b..".mp3");
elseif b>=30 and b<=39 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\4a"..b..".mp3");
elseif b>=40 and b<=49 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\5a"..b..".mp3");
elseif b>=50 and b<=59 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\6a"..b..".mp3");
elseif b>=60 and b<=69 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\7a"..b..".mp3");
elseif b>=70 and b<=79 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\8a"..b..".mp3");
elseif b>=80 and b<=89 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\9a"..b..".mp3");
elseif b>=90 and b<=99 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\a"..b..".mp3");
elseif b>=100 and b<=109 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\b"..b..".mp3");
elseif b>=110 and b<=119 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\c"..b..".mp3");
elseif b>=120 and b<=129 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\d"..b..".mp3");
elseif b>=130 and b<=139 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\e"..b..".mp3");
elseif b>=140 and b<=149 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\f"..b..".mp3");
elseif b>=150 and b<=159 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\g"..b..".mp3");
elseif b>=160 and b<=169 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\h"..b..".mp3");
elseif b>=170 and b<=179 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\i"..b..".mp3");
elseif b>=180 and b<=189 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\j"..b..".mp3");
elseif b>=190 and b<=199 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\k"..b..".mp3");
elseif b>=200 and b<=209 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\l"..b..".mp3");
elseif b>=210 and b<=219 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\m"..b..".mp3");
elseif b>=220 and b<=229 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\n"..b..".mp3");
elseif b>=230 and b<=239 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\o"..b..".mp3");
elseif b>=240 and b<=249 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\p"..b..".mp3");
elseif b>=250 and b<=259 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\q"..b..".mp3");
elseif b>=260 and b<=269 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\r"..b..".mp3");
elseif b>=270 and b<=279 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\s"..b..".mp3");
elseif b>=280 and b<=289 then
File.Rename(_SourceFolder.."\\"..b..".mp3", _SourceFolder.."\\t"..b..".mp3");
end
end
----- محتوى موجة أوامر دورها دمج الملفات كملف واحد ويمكن التحكم في اللاحقة
n = [[
copy /b *.mp3 belkiss.mp3
]]
--- استغلال التغليمة os
os.execute (n)
----- الملف المدمج الناتج يتم نسخه الى سطح المكتب
File.Copy(_SourceFolder.."\\belkiss.mp3", _DesktopFolder.."\\belkiss.mp3", true, true, false, true, nil);
----- ثم مسح للملفات الجديدة لاننا انهينا الدمج و ضار الملف جاهزا
File.Delete(_SourceFolder.."\\*.mp3", false, false, false, nil);
--------------------------------------------------------------------------------


على أساس أننا نريد الدمج بدء من الملف 1 إلى غاية عدد الملفات الموجود في المجلد , و كلما كان العدد أقل كانت النتائج أسرع
-----------------------------------------------------------------------
باستغلال المقترح يمكن تحقيق التكرار بكل بساطة لأنه صار بإمكانك التعامل مع ملف واحد فقط لتكرره بعدد المرات التي تريد .. فقط .

عبود عبود
18-07-2015, 10:58 AM
جزاك الله خيرا .............. ممتاز

http://www.abc4web.net/vb/images/icons/abc00.gif مثبت للإفادة العامة

:abc_152:

فرح صالحي
18-07-2015, 11:08 AM
شـكــ وبارك الله فيك ـــرا لك .:abc_152:.. لك مني أجمل تحية .

المـهاجر
18-07-2015, 01:02 PM
الكود جيد و يؤدى الغرض منه

لكنه يعالج حالة محددة فقط

بعد حذف التعليفات من الكود يتبقى 70 سطر
و لا زالت لا تتعامل مع أكثر من 289 ملف و كلما اردنا الزيادة أضفنا اسطرا للكود
تقوم بعمليات مسح للملفات بينما فى دوال الدمج لا يفترض إطلاقا ان تمر بتلك الخطوة (المسح بدون داعى يشكل إرهاق للقرص الصلب)
و بقى أخطر عيب
انها تغير أسماء الملفات الأصلية

حاول ان تجيب على هذه الأسئلة
هل إعادة تسمية الملفات هى الحل الأمثل ؟؟
هل يمكن ان تقوم حلقة بكل ما سبق و بدون اعادة التسمية ؟؟
هل يمكن ان يلائم الحل اى عدد من الملفات ؟؟

السيناريو الصحيح الذى لا يغير أسماء الملفات الأصلية
و يتعامل مع الملفات ذات الأسماء الرقمية أيا كان عددها
و لا يقوم بعمليات مسح
لا يتجاوز 16 سطر بدون دمج لأسطر الكود

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

بالتوفيق
:abc_152:

ثامر أبو بلقيس
18-07-2015, 02:44 PM
الكود جيد و يؤدى الغرض منه

لكنه يعالج حالة محددة فقط

بعد حذف التعليفات من الكود يتبقى 70 سطر
و لا زالت لا تتعامل مع أكثر من 289 ملف و كلما اردنا الزيادة أضفنا اسطرا للكود
تقوم بعمليات مسح للملفات بينما فى دوال الدمج لا يفترض إطلاقا ان تمر بتلك الخطوة (المسح بدون داعى يشكل إرهاق للقرص الصلب)
و بقى أخطر عيب
انها تغير أسماء الملفات الأصلية

حاول ان تجيب على هذه الأسئلة
هل إعادة تسمية الملفات هى الحل الأمثل ؟؟
هل يمكن ان تقوم حلقة بكل ما سبق و بدون اعادة التسمية ؟؟
هل يمكن ان يلائم الحل اى عدد من الملفات ؟؟

السيناريو الصحيح الذى لا يغير أسماء الملفات الأصلية
و يتعامل مع الملفات ذات الأسماء الرقمية أيا كان عددها
و لا يقوم بعمليات مسح
لا يتجاوز 16 سطر بدون دمج لأسطر الكود

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

بالتوفيق
:abc_152:

شكرا بارك الله فيك :abc_138:
إليك بحل بدون نقل و لامسح و تقليص 16 سطرا المطلوبة الى 8 مع دمج واحد
File.Delete(_SourceFolder.."\\AutoPlay\\Audio\\belkiss.mp3", false, false, false, nil);
f="";
for i=1,286 do
f= f..i..".mp3 +"
end
f2 = String.Mid(f, 1, String.Length(f)-1);
TextFile.WriteFromString(_SourceFolder.."\\AutoPlay\\Audio\\k.bat", 'copy /b ' ..f2..'belkiss.mp3', false);
File.Run(_SourceFolder.."\\AutoPlay\\Audio\\k.bat", "", "AutoPlay\\Audio\\", SW_HIDE, false);

ثامر أبو بلقيس
18-07-2015, 02:51 PM
جزاك الله خيرا .............. ممتاز

http://www.abc4web.net/vb/images/icons/abc00.gif مثبت للإفادة العامة

:abc_152:


بارك الله فيك :abc_138: متوقع منكم هذا التشجيع شكرا .

ثامر أبو بلقيس
18-07-2015, 02:54 PM
شـكــ وبارك الله فيك ـــرا لك .:abc_152:.. لك مني أجمل تحية .

مرور طيب بارك الله فيك :abc_138:

امل الماضي
18-07-2015, 03:00 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .
موفق بإذن الله ... لك مني أجمل تحية .
:abc_152:

azizsoft
18-07-2015, 03:36 PM
شكرا بارك الله فيك :abc_138:
إليك بحل بدون نقل و لامسح و تقليص 16 سطرا المطلوبة الى 8 مع دمج واحد
File.Delete(_SourceFolder.."\\AutoPlay\\Audio\\belkiss.mp3", false, false, false, nil);
f="";
for i=1,286 do
f= f..i..".mp3 +"
end
f2 = String.Mid(f, 1, String.Length(f)-1);
TextFile.WriteFromString(_SourceFolder.."\\AutoPlay\\Audio\\k.bat", 'copy /b ' ..f2..'belkiss.mp3', false);
File.Run(_SourceFolder.."\\AutoPlay\\Audio\\k.bat", "", "AutoPlay\\Audio\\", SW_HIDE, false);




عيد سعيد وكل عام وأنتم بخير أستاذ ثامر
بارك الله فيكم ونفع بكم
طرح جميل وجهد مميز :abc_022:

المـهاجر
18-07-2015, 03:47 PM
شكرا بارك الله فيك :abc_138:
إليك بحل بدون نقل و لامسح و تقليص 16 سطرا المطلوبة الى 8 مع دمج واحد
File.Delete(_SourceFolder.."\\AutoPlay\\Audio\\belkiss.mp3", false, false, false, nil);
f="";
for i=1,286 do
f= f..i..".mp3 +"
end
f2 = String.Mid(f, 1, String.Length(f)-1);
TextFile.WriteFromString(_SourceFolder.."\\AutoPlay\\Audio\\k.bat", 'copy /b ' ..f2..'belkiss.mp3', false);
File.Run(_SourceFolder.."\\AutoPlay\\Audio\\k.bat", "", "AutoPlay\\Audio\\", SW_HIDE, false);


هذه المرة سيناريو جيد بكثير عن المرة السابقة

لا ضير من انشاء ملفات باتش
إخراج اكوادك الى ملف نصى فكرة غير محبذة
إلا للضرورة القصوى فقط

ما السبب الذى إستبعد التعليمة os فى هذه المرة ؟؟

'copy /b ' ..f2..'belkiss.mp3'
ما الذى يمنعك من تطبيق التعليمة os مباشرة على هذا الكومند البسيط ؟؟؟
هذا ممكن بكل سهوله

أنا أعلم جيدا ان الأوتوبلاى هنا ستبرز رسالة خطأ
هل العيب من الأوتوبلاى ؟؟ لا
هل العيب من الكوماند ؟؟ لا
هل لابد من تعديل الكوماند او اضافة بارامترات ؟؟ لا أيضا

ينقصك مفتاح بسيط جدا لحل اللغز
حاول و ستصل

ثامر أبو بلقيس
18-07-2015, 08:37 PM
تنفيذ الأمر دون التخلي على التعليمة os

File.Delete(_SourceFolder.."\\AutoPlay\\Audio\\belkiss.mp3", false, false, false, nil);
f="";
for i=1,286 do
f= f..i..".mp3 +"
end
f2 = String.Mid(f, 1, String.Length(f)-1);
n ="echo copy /b " ..f2.. " belkiss.mp3 > AutoPlay/Audio/thameur.bat"
os.execute (n)
File.Run(_SourceFolder.."\\AutoPlay\\Audio\\thameur.bat", "", "AutoPlay\\Audio\\", SW_HIDE, false);

ثامر أبو بلقيس
18-07-2015, 08:43 PM
ربما ستقول لي الجزئية :
n ="echo copy /b " ..f2.. " belkiss.mp3 > AutoPlay/Audio/thameur.bat"
os.execute (n)

تعادل تماما إنشاء ملف كما حدث في المحاولة السابقة
----------------------------------------------------------------------------------------
لذلك أشعر بأن هذا ما عندي

:abc_138:هات ما عندك :abc_138:

abohmam
18-07-2015, 11:55 PM
بارك الله فيك أخى الفاضل ثامر

ماشاء الله عمل رائع ومتابعة قوية

جزاك الله خيرا

والشكر لأخينا المهاجر على لمحاته ومتابعته المفيدة :abc_022:

ثامر أبو بلقيس
19-07-2015, 01:09 AM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .
موفق بإذن الله ... لك مني أجمل تحية .
:abc_152:


مرور طيب بارك الله فيك شكرا :abc_152:

ثامر أبو بلقيس
19-07-2015, 01:10 AM
عيد سعيد وكل عام وأنتم بخير أستاذ ثامر
بارك الله فيكم ونفع بكم
طرح جميل وجهد مميز :abc_022:

عيد مبارك أستاذ عزيز شكرا على المرور الطيب :abc_138:

ثامر أبو بلقيس
19-07-2015, 01:11 AM
بارك الله فيك أخى الفاضل ثامر

ماشاء الله عمل رائع ومتابعة قوية

جزاك الله خيرا

والشكر لأخينا المهاجر على لمحاته ومتابعته المفيدة :abc_022:

شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

المـهاجر
19-07-2015, 03:47 PM
ربما ستقول لي الجزئية :
n ="echo copy /b " ..f2.. " belkiss.mp3 > AutoPlay/Audio/thameur.bat"
os.execute (n)

تعادل تماما إنشاء ملف كما حدث في المحاولة السابقة
----------------------------------------------------------------------------------------
لذلك أشعر بأن هذا ما عندي

:abc_138:هات ما عندك :abc_138:

حسنا
فعلا اكوادك لا تنفذ الكوماند مباشرة و لجأت لإنشاء الباتش مرة أخرى

لم و لن تتمكن من تنفيذ الكوماند لاين مباشرة (بدون باتش) قبل ان تفهم بداية كيف تعمل التعليمة os
و ما هو الفرق بين تنفيذ كوماند لاين و بين تنفيذ الباتش
س1
ما هو الفرق بين تنفيذ التعليمة os لباتش و بين تنفيذ التعليمة os لكوماند لاين مباشرة ؟؟ ام انه لا فرق ؟؟
س2
هل تريد الكود مباشرة ام تريد التفكير حتى الوصول ؟

معك فى الحالتين

ثامر أبو بلقيس
19-07-2015, 05:22 PM
حاولت استغلال Shell.Execute و لم أنجح
يمكنك وضع الكود مباشرة لكن لاحظ أني
مركز على كيفية تنفيذ التعليمة os لسطر برمجي في مسار معين :abc_088:
وهنا في حالتنا المجلد audio و بدون تكوين ملف الباتش
شكرا

أبو يوسف
19-07-2015, 05:55 PM
جزاك الله خيرا اخانا ابا بلقيس وبارك الله في كل متابع :abc_022:

المـهاجر
19-07-2015, 06:06 PM
حاولت استغلال Shell.Execute و لم أنجح
يمكنك وضع الكود مباشرة لكن لاحظ أني
مركز على كيفية تنفيذ التعليمة os لسطر برمجي في مسار معين :abc_088:
وهنا في حالتنا المجلد audio و بدون تكوين ملف الباتش
شكرا

أدرس الكود فى سطر 14 ففيه الإجابة على تساؤلك
Mp3 = File.Find(_SourceFolder.."\\AutoPlay\\Audio\\", "*.mp3", false, false, nil, nil);
count = Table.Count(Mp3 );
mid = ""
for i = 1,count do
if i ~= count then
mid = mid..i..".mp3/b + "
else
mid = mid..count..".mp3/b "
end
end
Start = "copy "
End = "outpot.mp3"
command = Start..mid..End
Folder.SetCurrent(_SourceFolder.."\\AutoPlay\\Audio\\");
os.execute (command)
File.Copy(_SourceFolder.."\\AutoPlay\\Audio\\outpot.mp3", _DesktopFolder.."\\outpot.mp3", true, true, false, true, nil);
السر كله هنا
Folder.SetCurrent(_SourceFolder.."\\AutoPlay\\Audio\\");

هذا الأمر بتغيير الفولد الحالى ليكون هو مسار التنفيذ
هو الذى يجعل الكود ينجح فى تنفيذ الكوماند لاين مباشرة دون الحاجة لإنشاء ملفات باتش
و يمنع الأوتوبلاى من إظهار خطأ مسار

إلى لقاء آخر
بالتوفيق
:abc_152:

ثامر أبو بلقيس
19-07-2015, 06:20 PM
أحسنت بارك الله فيك أفدتني كثيرا :abc_138:

ثامر أبو بلقيس
19-07-2015, 06:37 PM
جزاك الله خيرا اخانا ابا بلقيس وبارك الله في كل متابع :abc_022:


شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

خادم المسلمين
20-01-2016, 09:12 AM
كل الشكر والتقدسير لاستاذنا الاستاذ ثامر
:abc_022::abc_022:

حروف الزخرفة
08-04-2018, 08:35 PM
جزاكم الله خيرا إخوانى