سؤال

1- أي واحد هو الأفضل لاستخدامه لدفق الفيديو؟ TCP أو مقبس UDP ولماذا؟

2- أثناء بث مباشر ، تأتي الصوت والفيديو من الخادم بشكل منفصل ، فكيف يمكنني التأكد من أن الفيديو الذي أعرضه والصوت الذي أعزفه على الجهاز متزامن؟

هل كانت مفيدة؟

المحلول

لقد كتبت تطبيق الدردشة الصوتية منذ فترة ، وكان TCP غير وارد ، أن البث المتعدد UDP هو في الحقيقة الطريقة الوحيدة للذهاب إذا كنت تبحث عن تدفق بيانات قرب الوقت. هناك مشكلتان رئيسيتان في تدفق الأشياء على UDP على الرغم من:

  1. الحزم المسقط. في حالة الصوت ، إنه حل سهل للغاية. عادةً ما لا تحدث الحزم المسقطة فرقًا مسموعًا (يتم إلغاء ضغط الحزم بشكل فردي). ومع ذلك ، عند التعامل مع الفيديو ، خاصة إذا كان الفيديو مضغوطًا (عادةً ما يكون) ، فإن اكتشاف بروتوكول نقل مناسب يضمن أن متانة الشبكة هي مهمة شاقة على أقل تقدير ، خاصة إذا كنت تفعل ذلك من نقطة الصفر. يتم تقسيم إطارات الفيديو في حزم مختلفة. من الصعب معرفة ما يجب فعله عندما تكون هذه الحزم مفقودة.
  2. التزامن بين الصوت والفيديو. هذه مشكلة صعبة للغاية وأقترح قراءة البروتوكولات مثل RTSP (بروتوكول البث في الوقت الفعلي). هذه ليست مهمة سهلة ، ولكن هذه بعض المعلومات التمهيدية: http://www.cs.columbia.edu/~hgs/rtsp/ - في بعض الأحيان يتم ذلك عن طريق إرسال حزم المزامنة منفصلة (بعض البروتوكولات ترسل هذه عبر TCP) التي تخبر المشغل كيف يجب أن يتطابق الصوت مع الفيديو.

نصائح أخرى

سأفعل UDP. ومع ذلك يعتمد ذلك على ما تريد. سوف UDP إسقاط الحزم بدلاً من الانتظار (TCP). تتمثل المقايضة في ما إذا كنت تريد مستقراً ، ولكن في بعض الأحيان بطيئة ومكلفة ، أو واحدة فعالة ، ولكن في بعض الأحيان قد لا يتم تسليمها. الاختيار لك عندما يتعلق الأمر بكيفية تنفيذه وكيف تستخدمه.

حتى اليوم ، يتدفق YouTube عبر http ... إليك تطبيق NodeJS يقوم ببثى ملف إلى عميل المتصفح ... استخدم كنقطة انطلاق لاستمرار البث المباشر مع الصوت بشكل جيد في المزامنة

// usage 
// do following on server side (your laptop running nodejs)
// node this_file.js
//
// then once above is running point your browser at
//    http://localhost:8888
//
// of course your browser could be on your mobile or own custom app



var http = require('http'),
    fs = require('fs'),
    util = require('util');

var path = "/path/to/audio/or/video/file/local/to/server/cool.mp4"; // put any audio or video file here

var port = 8888;
var host = "localhost";

http.createServer(function (req, res) {

  var stat = fs.statSync(path);
  var total = stat.size;

  if (req.headers.range) {   // meaning client (browser) has moved the forward/back slider
                                         // which has sent this request back to this server logic ... cool
    var range = req.headers.range;
    var parts = range.replace(/bytes=/, "").split("-");
    var partialstart = parts[0];
    var partialend = parts[1];

    var start = parseInt(partialstart, 10);
    var end = partialend ? parseInt(partialend, 10) : total-1;
    var chunksize = (end-start)+1;
    console.log('RANGE: ' + start + ' - ' + end + ' = ' + chunksize);

    var file = fs.createReadStream(path, {start: start, end: end});
    res.writeHead(206, { 'Content-Range': 'bytes ' + start + '-' + end + '/' + total, 'Accept-Ranges': 'bytes', 'Content-Length': chunksize, 'Content-Type': 'video/mp4' });
    file.pipe(res);

  } else {

    console.log('ALL: ' + total);
    res.writeHead(200, { 'Content-Length': total, 'Content-Type': 'video/mp4' });
    fs.createReadStream(path).pipe(res);
  }
}).listen(port, host);

console.log("Server running at http://" + host + ":" + port + "/");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top