ওয়েবআরটিটিসি এবং একটি সার্ভার-ভিত্তিক পিয়ার সংযোগ ব্যবহার করে কীভাবে ওয়েবক্যাম এবং অডিও রেকর্ড করা যায়


90

আমি ব্যবহারকারীদের ওয়েবক্যাম এবং অডিও রেকর্ড করতে এবং এটি সার্ভারের কোনও ফাইলে সংরক্ষণ করতে চাই। এই ফাইলগুলি তখন অন্য ব্যবহারকারীদের কাছে পরিবেশন করতে সক্ষম হবে।

প্লেব্যাক নিয়ে আমার কোনও সমস্যা নেই, তবে লিখিত সামগ্রীটি রেকর্ড করতে আমার সমস্যা হচ্ছে।

আমার বোধগম্য যে getUserMedia .record()ফাংশনটি এখনও লেখা হয়নি - এটির জন্য এখন পর্যন্ত কেবল একটি প্রস্তাব দেওয়া হয়েছে।

আমি আমার সার্ভারে পিয়ার কানেকশনএপিআই ব্যবহার করে পিয়ার সংযোগ তৈরি করতে চাই। আমি বুঝতে পারি এটি কিছুটা হ্যাকি, তবে আমি ভাবছি সার্ভারে পিয়ার তৈরি করা এবং ক্লায়েন্ট-পিয়ার কী প্রেরণ করে তা রেকর্ড করা সম্ভব হওয়া উচিত।

যদি এটি সম্ভব হয় তবে আমার তখন এই তথ্যটি ফ্ল্যাভ বা অন্য কোনও ভিডিও ফর্ম্যাটে সংরক্ষণ করতে সক্ষম হওয়া উচিত।

আমার পছন্দটি হ'ল ওয়েবক্যাম + অডিও ক্লায়েন্ট-সাইডটি রেকর্ড করা, ক্লায়েন্টকে ভিডিও আপলোড করার আগে তাদের প্রথম প্রচেষ্টা পছন্দ না হলে পুনরায় রেকর্ড করার অনুমতি দেওয়া। এটি নেটওয়ার্ক সংযোগগুলিতে বাধা দেওয়ারও অনুমতি দেয়। আমি এমন কিছু কোড দেখেছি যা ওয়েবক্যাম থেকে ক্যানভাসে ডেটা প্রেরণ করে স্বতন্ত্র 'চিত্রগুলি' রেকর্ডিংয়ের অনুমতি দেয় - এটি দুর্দান্ত তবে আমার অডিওও দরকার need

আমার এখন পর্যন্ত ক্লায়েন্টের সাইড কোডটি এখানে রয়েছে:

  <video autoplay></video>

<script language="javascript" type="text/javascript">
function onVideoFail(e) {
    console.log('webcam fail!', e);
  };

function hasGetUserMedia() {
  // Note: Opera is unprefixed.
  return !!(navigator.getUserMedia || navigator.webkitGetUserMedia ||
            navigator.mozGetUserMedia || navigator.msGetUserMedia);
}

if (hasGetUserMedia()) {
  // Good to go!
} else {
  alert('getUserMedia() is not supported in your browser');
}

window.URL = window.URL || window.webkitURL;
navigator.getUserMedia  = navigator.getUserMedia || navigator.webkitGetUserMedia ||
                          navigator.mozGetUserMedia || navigator.msGetUserMedia;

var video = document.querySelector('video');
var streamRecorder;
var webcamstream;

if (navigator.getUserMedia) {
  navigator.getUserMedia({audio: true, video: true}, function(stream) {
    video.src = window.URL.createObjectURL(stream);
    webcamstream = stream;
//  streamrecorder = webcamstream.record();
  }, onVideoFail);
} else {
    alert ('failed');
}

function startRecording() {
    streamRecorder = webcamstream.record();
    setTimeout(stopRecording, 10000);
}
function stopRecording() {
    streamRecorder.getRecordedData(postVideoToServer);
}
function postVideoToServer(videoblob) {
/*  var x = new XMLHttpRequest();
    x.open('POST', 'uploadMessage');
    x.send(videoblob);
*/
    var data = {};
    data.video = videoblob;
    data.metadata = 'test metadata';
    data.action = "upload_video";
    jQuery.post("http://www.foundthru.co.uk/uploadvideo.php", data, onUploadSuccess);
}
function onUploadSuccess() {
    alert ('video uploaded');
}

</script>

<div id="webcamcontrols">
    <a class="recordbutton" href="javascript:startRecording();">RECORD</a>
</div>

আমি একই সমস্যা আছে। GetRecordedData () পদ্ধতিটি কি আপনার জন্য কাজ করছে? এটি আমার টাটকা আপডেট হওয়া ব্রাউজারগুলিতে নেই।
ফিরস

না - আমি 'গুগল ক্যানারি'ও চেষ্টা করেছি।
ডেভ হিলডিচ

হ্যাঁ আমি এটির উপরে গভীর নজর রাখছি - সঠিক সমাধান হলে আমি এই থ্রেডটি আপডেট করব।
ডেভ হিলডিচ

4
আপনি যদি উপরের প্রশ্নের সমাধান পেয়ে থাকেন তবে দয়া করে আমার সাথে ভাগ করুন, ধন্যবাদ
মুহাম্মদ

4
কেউ কি কোনও সার্ভার-সাইড আরটিসি ম্যাজিকের মাধ্যমে মিডিয়াস্ট্রিম বাইটগুলি পেতে সক্ষম হয়েছেন?
বিনয়

উত্তর:


44

আপনার অবশ্যই কুরান্টোর দিকে নজর দেওয়া উচিত । এটি একটি ওয়েবআরটিসি সার্ভার অবকাঠামো সরবরাহ করে যা আপনাকে একটি ওয়েবআরটিসি ফিড এবং আরও অনেক কিছু থেকে রেকর্ড করতে দেয়। এছাড়াও আপনি আবেদন আপনি পরিকল্পনা করা হয় জন্য কিছু উদাহরণ জানতে পারেন এখানে । সেই ডেমোতে রেকর্ডিং ক্ষমতা যুক্ত করা এবং মিডিয়া ফাইলটি একটি ইউআরআইতে (স্থানীয় ডিস্ক বা যে কোনও জায়গায়) সঞ্চয় করা সত্যিই সহজ।

প্রকল্পটি এলজিপিএল অ্যাপাচি ২.০ এর আওতায় লাইসেন্সপ্রাপ্ত


সম্পাদনা 1

এই পোস্টের পরে, আমরা একটি নতুন টিউটোরিয়াল যুক্ত করেছি যা দেখায় যে কীভাবে কয়েকটি পরিস্থিতিতে রেকর্ডার যুক্ত করা যায়

দাবি অস্বীকার: আমি সেই দলের অংশ যা কুরেন্টোকে বিকাশ করে।


4
@ রেডটোপিয়া সাম্প্রতিক কিছু লোড পরীক্ষায় আমরা একটি আই 5/16 জিবি র‌্যামে ওয়েব্র্টিকের 150 ওয়ান এক সংযোগ পেতে সক্ষম হয়েছি। আপনি আশা করতে পারেন যে এই সংখ্যাগুলি ভবিষ্যতে আরও ভাল হবে, তবে অলৌকিক চিহ্নগুলির আশা করবেন না: এসআরটিপি-র জন্য অনেকগুলি এনক্রিপশন চলছে, এবং এটি দাবী করছে। আমরা হার্ডওয়্যার-ত্বরণযুক্ত এনক্রিপশন / ডিক্রিপশন সন্ধান করছি এবং সংখ্যাগুলি আরও বেশি হবে এবং আমরা আপনাকে এটির আরও ভালভাবে পরীক্ষা না করা পর্যন্ত এটি কতটা ভাল হবে তা নিশ্চিত করতে পারছি না, তবে আমরা একটি 3x উন্নতির আশা করব
igracia

4
@ user344146 এটি সম্ভবত আমার উত্তর ছিল। আপনি কি এই পোস্টে একটি লিঙ্ক ভাগ করে নিতে চান? যদি আপনি এই উত্তরটি পেয়ে থাকেন তবে এটি সম্ভবত কারণ আপনি ইতিমধ্যে সেখানে বা তালিকায় থাকা এমন কিছু জিজ্ঞাসা করেছিলেন। দেখে মনে হচ্ছে আপনি একটি SNAPSHOT সংস্করণ সংকলন করার চেষ্টা করছেন। এই নিদর্শনগুলি কেন্দ্রীয়ভাবে প্রকাশিত হয় না, সুতরাং হয় আপনি টিউটোরিয়ালগুলির একটি প্রকাশ চেকআউট করুন বা আমাদের অভ্যন্তরীণ ডেভ রেপো ব্যবহার করুন। এটি তালিকায় অনেকবার উত্তর দেওয়া হয়েছে, বিকাশের সংস্করণগুলির সাথে কাজ করার বিষয়ে ডকুমেন্টেশনে একটি এন্ট্রি রয়েছে ... আমরা এটি লেখার জন্য সময় নিলাম, তাই এটি পড়তে সময় দেওয়া আপনার পক্ষে ভাল লাগবে।
ইগ্রাসিয়া

4
আমি এই জাতীয় রেকর্ডিং করতে কেবল কুরেন্টো ব্যবহার করছি। আমি জটিল নই, তবে ধারণাটি বুঝতে কিছুটা সময় প্রয়োজন - কারণ কিছু ডক্সই সত্যিকার অর্থে- এবং আমি কুর্তানোতে কী প্রেরণ করতে পারি বা ঘটনার বিবরণ এবং এই জাতীয় ঘটনাগুলি মাঝে মাঝে সত্যই হতাশার কারণ হতে পারে। তবে যাইহোক - এর মতো একটি উন্মুক্ত প্রকল্পটি সত্যই একটি দুর্দান্ত কাজ এবং ব্যবহারের পক্ষে মূল্যবান। কুরেন্টো কেবলমাত্র লিনাক্সে কাজ করছে (উইন্ডোজ সংস্করণটি অফিসিয়াল নয় এবং সম্পূর্ণ কার্যকারিতা সহ কাজ করে না)।
ক্রিশ্চিয়ান

4
উপরের প্রশ্নের উত্তরগুলি খুঁজে পেয়েছেন (অন্যদের জন্য এখানে পোস্ট করা), কুরেন্টো বর্তমানে জেডিকে .0.০ সমর্থন করে, এটি উবুন্টু ১৪.০৪-এর উপর নির্ভরশীল থাকতে হবে না, এটি পরবর্তী সংস্করণগুলিকেও সমর্থন করা উচিত, তবে উওুন্টুর অন্যান্য সংস্করণগুলিতে কুরেন্টো আনুষ্ঠানিকভাবে পরীক্ষা করা হয়নি / অন্যান্য লিনাক্স সংস্করণ। এছাড়াও কুরেন্টো ntal৪ বিট সংস্করণগুলি বিচ্ছিন্নতার জন্য সহজলভ্য হিসাবে প্রকাশ করে, তবে আপনি সার্ভারের 32 বিট সংস্করণ ইনস্টল করতে পারেন তবে আপনাকে এটি প্রথমে তৈরি করতে হবে।
বিল্বো ব্যাগিনস

4
দুর্ভাগ্যক্রমে, আমার উত্তরে যেমন বলা হয়েছে, টোলিও অধিগ্রহণের পরে কুরেন্টোর বিকাশ মারাত্মকভাবে হ্রাস পেয়েছে। আমি পরিবর্তে জানুস ব্যবহার করার পরামর্শ দিচ্ছি।
জামিক্স 3'18

17

দয়া করে, রেকর্ডআরটিসি পরীক্ষা করুন

RecordRTC MIT- র উপর লাইসেন্সকৃত হয় GitHub


4
রেকর্ড ভিডিও এবং অডিও একসঙ্গে (দুই পৃথক জিনিষ বদলে একটি বাস্তব ভিডিও বাস?) পারেন: - যে বেশ সন্ত্রস্ত আমার প্রশ্ন
ব্রায়ান প্রিয়

সম্মত - দুর্দান্ত, তবে দেখে মনে হচ্ছে এটি কেবল পৃথকভাবে ডেটা রেকর্ড করে।
ডেভ হিলডিচ


4
এই পদ্ধতিরটি ক্রোমে Whammy.js এর মাধ্যমে কাজ করে। এই সমস্যাটি সমস্যা থেকে যেহেতু মানটি এমএমুলেশন থেকে অনেক কম হয়ে থাকে হোয়ামি ক্রোমের মিডিয়াস্ট্রিমরেকর্ডারের অভাবের জন্য সরবরাহ করে। মূলত যা ঘটে তা হ'ল WhammyRecorder একটি মিডিয়া স্ট্রিম অবজেক্ট ইউআরএলে একটি ভিডিও ট্যাগকে নির্দেশ করে এবং তারপরে একটি নির্দিষ্ট ফ্রেমের হারে ক্যানভাস উপাদানটির ওয়েবপ স্নাপশট নেয় takes এরপরে Whammy ব্যবহার করে all সমস্ত ফ্রেমকে একসাথে একটি ওয়েব ভিডিওতে স্থাপন করতে।
বিনয়

15

আমি বিশ্বাস করি যে কেবল ভিডিও রেকর্ডিংয়ের জন্য কুরেন্টো বা অন্যান্য এমসিইউগুলি ব্যবহার করা কিছুটা ওভারকিল হবে, বিশেষত ভি 25 এর পরে ক্রোমকে ভি 47 এবং ফায়ারফক্সের মিডিয়া রেকর্ডার এপিআই সমর্থন রয়েছে তা বিবেচনা করে । সুতরাং এই সংযোগে, আপনার এমনকি কাজটি করার জন্য কোনও বাহ্যিক জেএস লাইব্রেরির প্রয়োজনও পড়তে পারে না, মিডিয়া রেকর্ডার ব্যবহার করে ভিডিও / অডিও রেকর্ড করার জন্য তৈরি এই ডেমোটি ব্যবহার করে দেখুন:

ডেমো - ক্রোম এবং ফায়ারফক্সে কাজ করবে (ইচ্ছাকৃতভাবে সার্ভার কোডে ব্লবটি পুশ করে বাইরে)

গিথুব কোড উত্স

ফায়ারফক্স চালু থাকলে আপনি নিজে এটি এখানে পরীক্ষা করতে পারেন (ক্রোমের প্রয়োজন https):

'use strict'

let log = console.log.bind(console),
  id = val => document.getElementById(val),
  ul = id('ul'),
  gUMbtn = id('gUMbtn'),
  start = id('start'),
  stop = id('stop'),
  stream,
  recorder,
  counter = 1,
  chunks,
  media;


gUMbtn.onclick = e => {
  let mv = id('mediaVideo'),
    mediaOptions = {
      video: {
        tag: 'video',
        type: 'video/webm',
        ext: '.mp4',
        gUM: {
          video: true,
          audio: true
        }
      },
      audio: {
        tag: 'audio',
        type: 'audio/ogg',
        ext: '.ogg',
        gUM: {
          audio: true
        }
      }
    };
  media = mv.checked ? mediaOptions.video : mediaOptions.audio;
  navigator.mediaDevices.getUserMedia(media.gUM).then(_stream => {
    stream = _stream;
    id('gUMArea').style.display = 'none';
    id('btns').style.display = 'inherit';
    start.removeAttribute('disabled');
    recorder = new MediaRecorder(stream);
    recorder.ondataavailable = e => {
      chunks.push(e.data);
      if (recorder.state == 'inactive') makeLink();
    };
    log('got media successfully');
  }).catch(log);
}

start.onclick = e => {
  start.disabled = true;
  stop.removeAttribute('disabled');
  chunks = [];
  recorder.start();
}


stop.onclick = e => {
  stop.disabled = true;
  recorder.stop();
  start.removeAttribute('disabled');
}



function makeLink() {
  let blob = new Blob(chunks, {
      type: media.type
    }),
    url = URL.createObjectURL(blob),
    li = document.createElement('li'),
    mt = document.createElement(media.tag),
    hf = document.createElement('a');
  mt.controls = true;
  mt.src = url;
  hf.href = url;
  hf.download = `${counter++}${media.ext}`;
  hf.innerHTML = `donwload ${hf.download}`;
  li.appendChild(mt);
  li.appendChild(hf);
  ul.appendChild(li);
}
      button {
        margin: 10px 5px;
      }
      li {
        margin: 10px;
      }
      body {
        width: 90%;
        max-width: 960px;
        margin: 0px auto;
      }
      #btns {
        display: none;
      }
      h1 {
        margin-bottom: 100px;
      }
<link type="text/css" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<h1> MediaRecorder API example</h1>

<p>For now it is supported only in Firefox(v25+) and Chrome(v47+)</p>
<div id='gUMArea'>
  <div>
    Record:
    <input type="radio" name="media" value="video" checked id='mediaVideo'>Video
    <input type="radio" name="media" value="audio">audio
  </div>
  <button class="btn btn-default" id='gUMbtn'>Request Stream</button>
</div>
<div id='btns'>
  <button class="btn btn-default" id='start'>Start</button>
  <button class="btn btn-default" id='stop'>Stop</button>
</div>
<div>
  <ul class="list-unstyled" id='ul'></ul>
</div>
<script src="https://code.jquery.com/jquery-2.2.0.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>


ক্রোম 49 হ'ল পতাকা ছাড়াই মিডিয়া রেকর্ডার এপিআই সমর্থন করে।
অক্টোবিয়ান নাইকু

7

হ্যাঁ, আপনি যেমনটি বুঝতে পেরেছিলেন, মিডিয়া স্ট্রিম রেকর্ডারটি বর্তমানে অযৌক্তিক।

মিডিয়াস্ট্রিমআরকর্ডারটি getMserMedia () স্ট্রিমগুলি রেকর্ড করার জন্য একটি ওয়েবআরটিসি এপিআই। এটি ওয়েব অ্যাপ্লিকেশনগুলিকে একটি লাইভ অডিও / ভিডিও সেশন থেকে একটি ফাইল তৈরি করার অনুমতি দেয়।

বিকল্পভাবে আপনি এটি http://ericbidelman.tumblr.com/post/31486670538/creating-webm-video-from-getusermedia মতো করতে পারেন তবে অডিওর অংশটি অনুপস্থিত।


4
হ্যাঁ, এবং আপনি অডিও ফাইলটি ক্যাপচার করতে পারেন, এটি সার্ভারে প্রেরণ করতে পারেন এবং সার্ভারের পাশে একটি আসল ভিডিও ফাইল তৈরি করতে সেখানে তাদের একত্রিত করতে পারেন। তবে কম্পিউটার কম্পিউটারের কনফিগারেশনের উপর নির্ভর করে ক্লায়েন্টের পক্ষে এই সমাধানটি খুব ধীর হতে পারে, কারণ এটি একটি ক্যানভাস ব্যবহার করে চিত্র ফাইল তৈরি করতে হবে এবং অডিওটি ক্যাপচার করতে হবে, এবং এই সমস্ত কিছুই র‌্যামে ... বিটিডাব্লু, ফায়ারফক্স দল এতে কাজ করছে , তাই আশা করি তারা শীঘ্রই এটি প্রকাশ করবেন।
ফিরস

4

আপনি রেকর্ডআরটিসি-একসাথে ব্যবহার করতে পারেন , যা রেকর্ডআরটিসি-র উপর ভিত্তি করে।

এটি পৃথক ফাইলে এক সাথে ভিডিও এবং অডিও রেকর্ডিং সমর্থন করে। আপনার ffmpegদুটি ডিভাইস সার্ভারে একত্রীকরণের মতো সরঞ্জামের প্রয়োজন হবে ।


4
এটি একটি ব্রাউজার সমাধান, সার্ভার-সাইড নয়।
ব্র্যাড

2

ওয়েব কল সার্ভার 4 ওয়েবেআরটিটিসি অডিও এবং ভিডিও ওয়েবএম ধারকটিতে রেকর্ড করতে পারে। রেকর্ডিংটি অডিওর জন্য ভারবিস কোডেক এবং ভিডিওর জন্য ভিপি 8 কোডেক ব্যবহার করে করা হয়। ইনিয়েটিয়াল ওয়েবআরটিটিসি কোডেকগুলি হ'ল ওপাস বা জি 711 এবং ভিপি 8। সুতরাং, সার্ভার-সাইড রেকর্ডিংয়ের জন্য অপাস / জি 711 থেকে ভারবিস সার্ভার-সাইড ট্রান্সকোডিং বা ভিপি 8-এইচ .264 ট্রান্সকোডিং প্রয়োজন যদি অন্য ধারক, যেমন এভিআই ব্যবহার করা প্রয়োজন হয়।


এই বাণিজ্যিক জিনিস?
স্টেপান ইয়াকোভেনকো

0

রেকর্ডের জন্য আমারও এ সম্পর্কে যথেষ্ট জ্ঞান নেই,

তবে আমি এটি গিট হাব- এ পেয়েছি

<!DOCTYPE html>
 <html>
<head>
  <title>XSockets.WebRTC Client example</title>
  <meta charset="utf-8" />


<style>
body {

  }
.localvideo {
position: absolute;
right: 10px;
top: 10px;
}

.localvideo video {
max-width: 240px;
width:100%;
margin-right:auto;
margin-left:auto;
border: 2px solid #333;

 }
 .remotevideos {
height:120px;
background:#dadada;
padding:10px; 
}

.remotevideos video{
max-height:120px;
float:left;
 }
</style>
</head>
<body>
<h1>XSockets.WebRTC Client example </h1>
<div class="localvideo">
    <video autoplay></video>
</div>

<h2>Remote videos</h2>
<div class="remotevideos">

</div>
<h2>Recordings  ( Click on your camera stream to start record)</h2>
<ul></ul>


<h2>Trace</h2>
<div id="immediate"></div>
<script src="XSockets.latest.js"></script>
<script src="adapter.js"></script>
<script src="bobBinder.js"></script>
<script src="xsocketWebRTC.js"></script>
<script>
    var $ = function (selector, el) {
        if (!el) el = document;
        return el.querySelector(selector);
    }
    var trace = function (what, obj) {
        var pre = document.createElement("pre");
        pre.textContent = JSON.stringify(what) + " - " + JSON.stringify(obj || "");
        $("#immediate").appendChild(pre);
    };
    var main = (function () {
        var broker;
        var rtc;
        trace("Ready");
        trace("Try connect the connectionBroker");
        var ws = new XSockets.WebSocket("wss://rtcplaygrouund.azurewebsites.net:443", ["connectionbroker"], {
            ctx: '23fbc61c-541a-4c0d-b46e-1a1f6473720a'
        });
        var onError = function (err) {
            trace("error", arguments);
        };
        var recordMediaStream = function (stream) {
            if ("MediaRecorder" in window === false) {
                trace("Recorder not started MediaRecorder not available in this browser. ");
                return;
            }
            var recorder = new XSockets.MediaRecorder(stream);
            recorder.start();
            trace("Recorder started.. ");
            recorder.oncompleted = function (blob, blobUrl) {
                trace("Recorder completed.. ");
                var li = document.createElement("li");
                var download = document.createElement("a");
                download.textContent = new Date();
                download.setAttribute("download", XSockets.Utils.randomString(8) + ".webm");
                download.setAttribute("href", blobUrl);
                li.appendChild(download);
                $("ul").appendChild(li);
            };
        };
        var addRemoteVideo = function (peerId, mediaStream) {
            var remoteVideo = document.createElement("video");
            remoteVideo.setAttribute("autoplay", "autoplay");
            remoteVideo.setAttribute("rel", peerId);
            attachMediaStream(remoteVideo, mediaStream);
            $(".remotevideos").appendChild(remoteVideo);
        };
        var onConnectionLost = function (remotePeer) {
            trace("onconnectionlost", arguments);
            var peerId = remotePeer.PeerId;
            var videoToRemove = $("video[rel='" + peerId + "']");
            $(".remotevideos").removeChild(videoToRemove);
        };
        var oncConnectionCreated = function () {
            console.log(arguments, rtc);
            trace("oncconnectioncreated", arguments);
        };
        var onGetUerMedia = function (stream) {
            trace("Successfully got some userMedia , hopefully a goat will appear..");
            rtc.connectToContext(); // connect to the current context?
        };
        var onRemoteStream = function (remotePeer) {
            addRemoteVideo(remotePeer.PeerId, remotePeer.stream);
            trace("Opps, we got a remote stream. lets see if its a goat..");
        };
        var onLocalStream = function (mediaStream) {
            trace("Got a localStream", mediaStream.id);
            attachMediaStream($(".localvideo video "), mediaStream);
            // if user click, video , call the recorder
            $(".localvideo video ").addEventListener("click", function () {
                recordMediaStream(rtc.getLocalStreams()[0]);
            });
        };
        var onContextCreated = function (ctx) {
            trace("RTC object created, and a context is created - ", ctx);
            rtc.getUserMedia(rtc.userMediaConstraints.hd(false), onGetUerMedia, onError);
        };
        var onOpen = function () {
            trace("Connected to the brokerController - 'connectionBroker'");
            rtc = new XSockets.WebRTC(this);
            rtc.onlocalstream = onLocalStream;
            rtc.oncontextcreated = onContextCreated;
            rtc.onconnectioncreated = oncConnectionCreated;
            rtc.onconnectionlost = onConnectionLost;
            rtc.onremotestream = onRemoteStream;
            rtc.onanswer = function (event) {
            };
            rtc.onoffer = function (event) {
            };
        };
        var onConnected = function () {
            trace("connection to the 'broker' server is established");
            trace("Try get the broker controller form server..");
            broker = ws.controller("connectionbroker");
            broker.onopen = onOpen;
        };
        ws.onconnected = onConnected;
    });
    document.addEventListener("DOMContentLoaded", main);
</script>

আমার কেস কোডে লাইন 89৯-তে অনারকর্ড কমপ্লিট আসলে রেকর্ডার ফাইলের একটি লিঙ্ক যুক্ত করুন, আপনি যদি সেই লিঙ্কটিতে ক্লিক করেন তবে এটি ডাউনলোড শুরু হবে, আপনি সেই ফাইলটিকে আপনার সার্ভারে সেভ করতে পারবেন।

রেকর্ডিং কোডটি এরকম কিছু দেখাচ্ছে

recorder.oncompleted = function (blob, blobUrl) {
                trace("Recorder completed.. ");
                var li = document.createElement("li");
                var download = document.createElement("a");
                download.textContent = new Date();
                download.setAttribute("download", XSockets.Utils.randomString(8) + ".webm");
                download.setAttribute("href", blobUrl);
                li.appendChild(download);
                $("ul").appendChild(li);
            };

BlobUll পথ ধরে। আমি এটি দিয়ে আমার সমস্যাটি সমাধান করেছি, আশা করি কেউ এটির উপকার পাবেন


-4

প্রযুক্তিগতভাবে আপনি ভিডিও এবং অডিও মিশ্রিত করতে ব্যাকএন্ডে এফএফএমপিইগ ব্যবহার করতে পারেন


7
হ্যাঁ তবে আপনি ওখানে কীভাবে পাবেন?
এডি মঙ্গে জুনিয়র
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.