100

ユーザーのウェブカメラと音声を記録し、サーバー上のファイルに保存したいと思います。これらのファイルは、他のユーザーに提供できるようになります。

再生には問題ありませんが、コンテンツの記録に問題があります。

私の理解では、getUserMedia.record()関数はまだ作成されていません。これまでのところ、提案のみが行われています。

PeerConnectionAPI を使用してサーバーにピア接続を作成したいと考えています。これは少しハックであることは理解していますが、サーバー上にピアを作成し、クライアントピアが送信するものを記録できるはずだと考えています。

これが可能であれば、このデータを flv またはその他のビデオ形式で保存できるはずです。

私の好みは、実際にはクライアント側でウェブカメラとオーディオを記録することです。これにより、クライアントがアップロード前の最初の試行が気に入らなかった場合にビデオを再記録できるようになります。これにより、ネットワーク接続の中断も可能になります。データをキャンバスに送信することで、Web カメラから個々の「画像」を記録できるコードを見てきました。これは素晴らしいことですが、音声も必要です。

私がこれまでに持っているクライアント側のコードは次のとおりです。

  <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>
4

9 に答える 9

19

特にChromeがv47からMediaRecorder APIをサポートし、v25からFirefoxをサポートしていることを考えると、ビデオを録画するためだけにkurentoや他のMCUを使用するのは少しやり過ぎだと思います. したがって、このジャンクションでは、ジョブを実行するために外部 js ライブラリさえ必要ない場合があります。MediaRecorder を使用してビデオ/オーディオを記録するために作成したこのデモを試してください。

デモ- chrome と firefox で動作します (ブロブをサーバー コードにプッシュすることは意図的に省略されています)

Github コード ソース

Firefox を実行している場合は、ここでテストできます (chrome が必要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>

于 2016-04-22T02:29:07.103 に答える
3

Web Call Server 4は、WebRTC オーディオとビデオを WebM コンテナーに記録できます。録音は、オーディオに Vorbis コーデック、ビデオに VP8 コーデックを使用して行われます。初期の WebRTC コーデックは、Opus または G.711 および VP8 です。したがって、サーバー側の記録には、Opus/G.711 から Vorbis サーバー側へのトランスコーディング、または AVI などの別のコンテナーを使用する必要がある場合は VP8-H.264 トランスコーディングが必要です。

于 2015-09-10T20:14:59.997 に答える
-6

技術的には、バックエンドでFFMPEGを使用してビデオとオーディオをミックスできます

于 2013-11-11T16:45:11.157 に答える