من المعروف أن متحكم Arduino الضعيف غير قادر على تمرير دفق فيديو من خلاله.وإذا اقتربت من هذه المهمة من جهة أخرى؟... وتمتد عملية التصوير في الوقت المناسب.لقد خمن الكثيرون لأنفسهم بالفعل أن هذه التقنية تسمى اللقطة الزمنية (تصوير إطار واحد بطيء الحركة). بمعنى ، هذا ليس تصوير فيديو ، ولكن تصوير ، ونتيجة لذلك يتم إنشاء مقطع فيديو.أعترف ، في البداية لم أخطط للقيام بحركة بطيئة. أردت فقط أن أسجل أحداثًا لاردويناتي ، بما في ذلك مع الصور. حسنا ، ثم إيقاف التشغيل. إذا لم يشارك القارئ في التطوير ، فيمكنه فقط رؤية النتيجة (انتقل من تحت Chrome).ما يتكون نظامي من:- اردوينو ميجا بورد
- وحدة JPEG للكاميرا ؛
- فائدة وقاعدة بيانات MongoDB ؛
- خادم WEB لاستضافة ملفات HTML ؛
عندما يرسل arduina بياناته إلى الخادم ، يتم إرفاق الطابع الزمني الخاص بكل معلمة.تم إرسال المعلمة - تم إضافة سجل إلى المستودع ، تم إرسال مرتين أخريين - تم حفظ سجلين آخرين.يتم تنفيذ جميع الأعمال مع المستودع من خلال برنامج الأداة المساعدة (المشار إليه فيما يلي باسم الوسيط) ، والذي يتم إطلاقه على جهاز كمبيوتر ثابت. في الوقت نفسه ، يقدم خادم WEB نفسه محتوى ثابتًا فقط. أي أن جميع العملاء يقومون بتبادل المعلومات من خلال برنامج الأداة المساعدة للوسيط ، على غرار بروتوكول MQTT الشائع. سيكون الفرق الرئيسي من MQTT هو أن هذا الوسيط يعمل مباشرة مع مستودع البيانات ، مما يوفر العمل مع البيانات التاريخية. هذه الحقيقة تبسط مخطط التفاعل ، ولا تتطلب حركة مرور إضافية للشبكة لحفظ البيانات.من أجل راحة تطوير تطبيقات الويب الخاصة بي ، أنشأت مكتبة جافا سكريبت باستخدام واجهة برمجة التطبيقات التالية:يؤدي هذا إلى إنشاء عميل للعمل مع تخزين الشبكة:var client = new MgtClient("localhost", "login", "password", onDebugLog);
وسيطات الدالة:- عنوان الشبكة الذي يعمل عليه البرنامج الوسيط ، يمكنك ببساطة تحديد IP ، على سبيل المثال ، "127.0.0.1" ؛
- تسجيل دخول المستخدم ؛
- كلمة مرور المستخدم
- وظيفة رد الاتصال ، لتصحيح رسائل السلسلة ؛
قد تبدو وظيفة رد الاتصال لتصحيح الأخطاء كما يلي:function onDebugLog(aStr) {
console.log((new Date()).getTimeString() + ' ' + aStr + '\n');
}
ليس صعبا بعد؟ علاوة على ذلك سيكون من الصعب.هيكل طلب التخزين:var request = {
name: " 1",
placeId: 1,
beginTime: 1458108472000,
endTime: 1458194872000,
limit: 10000
};
لم يخلط بعد؟ثم هنا هيكل الرد على الطلب:var result = {
times: [],
values: [],
position: 20,
status: "progress",
progress: 91
};
نعم ، هل هو أكثر تعقيدًا؟حالة حقل "الحالة":- "تم" - تلقي كل ما تم طلبه (إما تم استلام بيانات النطاق الزمني بأكمله أو الحد الأقصى لعدد السجلات التي تم العمل بها) ؛
- يشير "التقدم" - إلى أن هذه ليست آخر قطعة من البيانات ، وأن عملية التنزيل لم تنته بعد ؛
- "إحباط" - تمت مقاطعة تنزيل البيانات (تم تقييد القيود على إجمالي كمية البيانات التي يتم ضخها) ، يمكنك على الفور إنشاء طلب جديد لاستلام البيانات المفقودة ؛
- "فشل" - حدث خطأ (ربما لا يوجد تيار في المنفذ؟)
هل تعتقد أن هذا كل شيء؟ لسوء الحظ لا.يمكن أن تكون المعلمات المطلوبة من أنواع مختلفة.- إذا كانت المعلمة رقمية ، فستظهر الأرقام في مصفوفة القيم.
- إذا كانت السلسلة ، فستكون السلاسل في صفيف القيم.
- إذا كانت منطقية ، فستكون مجموعة القيم "true" أو "false".
- إذا كانت ثنائية (على سبيل المثال ، صورة JPEG) ، فسيحتوي صفيف القيم على صفائف بايت.
- إذا كان هذا حدثًا ، فقم بإرجاع الصفيفات التي تم تكوينها بطريقة خاصة.
مثال على سجل حدث واحد:var event = [
" ",
"",
27.5,
"",
true,
...
"",
1458108472000
];
أي أن كل سجل حدث قد يحتوي على مجموعة عشوائية من المعلمات. مثل هذا التجمع مناسب جدًا لتحليل الصورة العامة.Uff ، الجزء الأصعب قد انتهى.وهكذا يبدو الطلب الذي يرسل نفسه:
client.readArchive(aRequest, onReadArchive);
دالة عكسية للحصول على إجابات:
onReadArchive(aResult) {
return false;
}
أخيرًا ، جئنا إلى تحرير الفيديو نفسه.لإنشاء الفيديو ، استخدمت مكتبة Whammy javascript ، لمزيد من التفاصيل هنا.الوظيفة التي تنشئ الفيديو:
<script src="whammy.js"></script>
<canvas id="canvas" style="display:none"></canvas>
<video id="player" controls autoplay loop></video>
function createVideo() {
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
canvas.width = '640';
canvas.height = '480';
var framerate = 10;
var quality = 0.8;
var video = new Whammy.Video(framerate, quality);
for (var i = 0; i < images.length; i++) {
var image = images[i];
context.globalAlpha = 1;
context.drawImage(image, 0, 0, 640, 480);
video.add(context);
}
var output = video.compile();
var url = URL.createObjectURL(output);
document.getElementById('player').src = url;
}
للأسف ، لا يمكنك إنشاء مقاطع فيديو في جميع المتصفحات. على سبيل المثال ، لا يعرف Firefox المفضل لدي كيفية تحويل الصور إلى تنسيق WebP ، والذي يتم على أساسه التحويل إلى الفيديو. وعلى الرغم من أنني وجدت مكتبة جافا سكريبت لمثل هذا التحويل ، فقد تحولت ببطء شديد (وكان هناك العديد من الإطارات) لدرجة أنني رفضت استخدامها. ومع ذلك ، في جميع المتصفحات بمحرك Chrome ، سيعمل هذا الشيء.هنا يمكنك أن ترى ما فعلته.بدون وثائق كاملة ، يمكنني عرض مقالاتي السابقة.المادة 1المادة 2حسنًا ، هذا كل شيء ، وليس لدي أي شيء أقوله.