0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MediaMTXで映像を録画

Posted at

これまで、MediaMTXで映像配信、静止画配信の投稿をしてきました。

MediaMTXで映像配信
MediaMTXで静止画を配信

今回は、配信のために集めた映像を録画し後で見え返せるようにしてみます。

もろもろコードは以下にあります。

録画を有効化

mediamtx.ymlに以下を記載しておきます。

mediamtx.yml
paths:
  recording:
    record: yes
    recordPath: /recordings/%path/%Y%m%d%H%M%S_%f
    recordFormat: fmp4

こうすることで、recordingというpathにWebRTCを送信すると録画をしてくれます。もちろん配信もこれまで通り可能です。

/recordingsというフォルダは、Dockerで以下のように設定しています。

docker-compose.yaml
services:
  mediamtx:
    volumes:
      - /share/Documents/mediamtx/recordings:/recordings

ただし、このままだと、所有者がadminユーザの録画ファイルができてしまうため、QNAPサーバの一般ユーザの所有者で保存するようにします。

docker-compose.yaml
services:
  mediamtx:
    user: "1000:100"

user:groupの番号は、QNAPのユーザ・グループのIDを指定してください。

WebRTC入力映像のコーディックをH.264にする

入力映像は、WebRTCにしようと思いますが、デフォルトの動画のコーデックがVP8で、MediaMTXで録画可能なフォーマットではないです。
そこで、H.264でMediaMTXに入力する必要があります。

そのためには、WebRTCのネゴシエーション時に生成されるSDPにおいて、VP8よりH.264の優先度を上げる必要があります。そのために、ちょっと強引ですが、生成されたSDPを編集してからMediaMTXに渡すようにします。

webrtc_utils.js
function prioritizeH264(sdp) {
  const h264pts = [...sdp.matchAll(/a=rtpmap:(\d+) H264\/90000/g)].map(m => m[1]);
  if (h264pts.length === 0)
    return sdp;

  const firstH264 = h264pts[0];
  return sdp.replace(/m=video .*\r\n/, (line) => {
    const parts = line.trim().split(" ");
    const header = parts.slice(0, 3).join(" "); // m=video 9 UDP/TLS/RTP/SAVPF
    const pts = parts.slice(3);

    const reordered = [firstH264, ...pts.filter(pt => pt !== firstH264)];
    return `${header} ${reordered.join(" ")}\r\n`;
  });
}

録画ファイルのリスト取得

録画ファイルを再生するには、以下のように有効にします。

mediamtx.yml
playback: yes
playbackAddress: [QNAPサーバ]:9996

そうすると、次のように呼び出すと、録画ファイルの一覧(URLと開始時間と記録時間)が取得されます。

index.js
const recording_base_url = 'https://[QNAPサーバ]:29996';
const recording_base_url_old = 'http://[QNAPサーバ]:9996';

  if( event.path == '/mediamtx-get-recording'){
    var user = event.requestContext.basicAuth.basic[0];
    var password = event.requestContext.basicAuth.basic[1];

    var input = {
      url: recording_base_url_old + "/list?path=recording",
      method: "GET",
      headers: {
          Authorization: "Basic " + btoa(user + ":" + password)
      }
    };
    var result = await HttpUtils.do_http(input);
    console.log(result);

    result = result.map(item => {
      item.url_view = item.url.replace(recording_base_url_old, recording_base_url);
      return item;
    });
    return new Response({ list: result });
  }else

返ってきたURLが、Dockerに立ち上げているのでlocalhostになってしまっているので、変換しています。

クライアント側で、このURLをブラウザから開くとその動画が表示されます。

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?