เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚เชฅเซ€ (เชฒเช—เชญเช—) เชจเช•เชพเชฎเซเช‚ เชตเซ‡เชฌเช•เซ…เชฎ เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช—. เชฎเซ€เชกเชฟเชฏเชพ เชธเซเชŸเซเชฐเซ€เชฎ เช…เชจเซ‡ เชตเซ‡เชฌเชธเซ‹เช•เซ‡เชŸเซเชธ

เช† เชฒเซ‡เช–เชฎเชพเช‚ เชนเซเช‚ Adobe Flash Player เชœเซ‡เชตเชพ เชคเซƒเชคเซ€เชฏ-เชชเช•เซเชท เชฌเซเชฐเชพเช‰เชเชฐ เชชเซเชฒเช—เชฟเชจเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เชตเซ‡เชฌเชธเซ‹เช•เซ‡เชŸเซเชธ เชฆเซเชตเชพเชฐเชพ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎ เช•เชฐเชตเชพเชจเชพ เชฎเชพเชฐเชพ เชชเซเชฐเชฏเชพเชธเซ‹เชจเซ‡ เชถเซ‡เชฐ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚. เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชถเซเช‚ เช†เชตเซเชฏเซเช‚ เชคเซ‡ เชœเชพเชฃเชตเชพ เชฎเชพเชŸเซ‡ เช†เช—เชณ เชตเชพเช‚เชšเซ‹.

Adobe Flash, เช…เช—เชพเช‰ Macromedia Flash, เชตเซ‡เชฌ เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เชšเชพเชฒเชคเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เช›เซ‡. เชฎเซ€เชกเชฟเชฏเชพ เชธเซเชŸเซเชฐเซ€เชฎ API เชจเซ€ เชฐเชœเซ‚เช†เชค เชชเชนเซ‡เชฒเชพเช‚, เชคเซ‡ เชตเซ‡เชฌเช•เซ‡เชฎเชฅเซ€ เชตเชฟเชกเชฟเชฏเซ‹ เช…เชจเซ‡ เชตเซ‰เช‡เชธ เชธเซเชŸเซเชฐเซ€เชฎ เช•เชฐเชตเชพ เชคเซ‡เชฎเชœ เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เชตเชฟเชตเชฟเชง เชชเซเชฐเช•เชพเชฐเชจเซ€ เช•เซ‹เชจเซเชซเชฐเชจเซเชธ เช…เชจเซ‡ เชšเซ‡เชŸเซเชธ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชตเซเชฏเชตเชนเชพเชฐเซ€เช• เชฐเซ€เชคเซ‡ เชเช•เชฎเชพเชคเซเชฐ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชนเชคเซเช‚. เชฎเซ€เชกเชฟเชฏเชพ เชฎเชพเชนเชฟเชคเซ€ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ RTMP (เชฐเซ€เช…เชฒ เชŸเชพเชˆเชฎ เชฎเซ‡เชธเซ‡เชœเชฟเช‚เช— เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ) เชตเชพเชธเซเชคเชตเชฎเชพเช‚ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏเชฅเซ€ เชฌเช‚เชง เชนเชคเซ‹, เชœเซ‡เชจเซ‹ เช…เชฐเซเชฅ เชนเชคเซ‹: เชœเซ‹ เชคเชฎเซ‡ เชคเชฎเชพเชฐเซ€ เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เชธเซ‡เชตเชพเชจเซ‡ เชฌเซเชธเซเชŸ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹, เชคเซ‹ Adobe-Adobe Media Server (AMS) เชจเชพ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเชพ เชฆเชฏเชพเชณเซ เชฌเชจเซ‹.

2012 เชฎเชพเช‚ เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเช›เซ€, Adobe เชœเชพเชนเซ‡เชฐ เชœเชจเชคเชพ เชฎเชพเชŸเซ‡ "เชคเซเชฏเชพเช— เช•เชฐเซเชฏเซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฌเชนเชพเชฐ เช•เชพเชขเซเชฏเซ‹". เชธเซเชชเชทเซเชŸเซ€เช•เชฐเชฃ RTMP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ, เชœเซ‡เชฎเชพเช‚ เชญเซ‚เชฒเซ‹ เชนเชคเซ€ เช…เชจเซ‡ เช…เชจเชฟเชตเชพเชฐเซเชฏเชชเชฃเซ‡ เช…เชชเซ‚เชฐเซเชฃ เชนเชคเซ€. เชคเซ‡ เชธเชฎเชฏ เชธเซเชงเซ€เชฎเชพเช‚, เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เช เช† เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚, เช…เชจเซ‡ Wowza เชธเชฐเซเชตเชฐ เชฆเซ‡เช–เชพเชฏเซเช‚. 2011 เชฎเชพเช‚, Adobeเช RTMP-เชธเช‚เชฌเช‚เชงเชฟเชค เชชเซ‡เชŸเชจเซเชŸเชจเชพ เช—เซ‡เชฐเช•เชพเชฏเชฆเซ‡เชธเชฐ เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡ Wowza เชธเชพเชฎเซ‡ เชฆเชพเชตเซ‹ เชฆเชพเช–เชฒ เช•เชฐเซเชฏเซ‹ เชนเชคเซ‹; 4 เชตเชฐเซเชท เชชเช›เซ€, เชธเช‚เช˜เชฐเซเชทเชจเซ‹ เชธเซŒเชนเชพเชฐเซเชฆเชชเซ‚เชฐเซเชตเช• เช‰เช•เซ‡เชฒ เชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹.

Adobe Flash เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ 20 เชตเชฐเซเชทเชฅเซ€ เชตเชงเซ เชœเซ‚เชจเซเช‚ เช›เซ‡, เชคเซ‡ เชธเชฎเชฏ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช˜เชฃเซ€ เชจเชฟเชฐเซเชฃเชพเชฏเช• เชจเชฌเชณเชพเชˆเช“ เชฎเชณเซ€ เช†เชตเซ€ เช›เซ‡, เชธเชชเซ‹เชฐเซเชŸ เชตเชšเชจ เช†เชชเซเชฏเซเช‚ เชนเชคเซเช‚ เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เชธเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เชฅเซ‹เชกเชพ เชตเชฟเช•เชฒเซเชชเซ‹ เช›เซ‹เชกเซ€เชจเซ‡, 2020 เชธเซเชงเซ€เชฎเชพเช‚ เชธเชฎเชพเชชเซเชค เชฅเชถเซ‡.

เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ เชคเชฐเชค เชœ เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เชซเซเชฒเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช›เซ‹เชกเซ€ เชฆเซ‡เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. เชฎเซ‡เช‚ เช‰เชชเชฐเชจเซเช‚ เชฎเซเช–เซเชฏ เช•เชพเชฐเชฃ เชธเซ‚เชšเชตเซเชฏเซเช‚ เช›เซ‡; เชซเซเชฒเซ‡เชถ เชชเชฃ เชฎเซ‹เชฌเชพเช‡เชฒ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชชเชฐ เชฌเชฟเชฒเช•เซเชฒ เชธเชชเซ‹เชฐเซเชŸเซ‡เชก เชจเชฅเซ€, เช…เชจเซ‡ เชนเซเช‚ เช–เชฐเซ‡เช–เชฐ Windows (เชตเชพเช‡เชจ เช‡เชฎเซเชฏเซเชฒเซ‡เชŸเชฐ) เชชเชฐ เชตเชฟเช•เชพเชธ เชฎเชพเชŸเซ‡ Adobe Flash เชจเซ‡ เชœเชฎเชพเชตเชตเชพ เชฎเชพเช‚เช—เชคเซ‹ เชจ เชนเชคเซ‹. เชคเซ‡เชฅเซ€ เชฎเซ‡เช‚ JavaScript เชฎเชพเช‚ เช•เซเชฒเชพเชฏเช‚เชŸ เชฒเช–เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. เช† เชฎเชพเชคเซเชฐ เชเช• เชชเซเชฐเซ‹เชŸเซ‹เชŸเชพเช‡เชช เชนเชถเซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชชเช›เซ€เชฅเซ€ เชฎเชจเซ‡ เช–เชฌเชฐ เชชเชกเซ€ เช•เซ‡ p2p เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เชตเชงเซ เช•เชพเชฐเซเชฏเช•เซเชทเชฎ เชฐเซ€เชคเซ‡ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชซเช•เซเชค เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชคเซ‡ เชชเซ€เช…เชฐ - เชธเชฐเซเชตเชฐ - เชชเซ€เช…เชฐ เชนเชถเซ‡, เชชเชฐเช‚เชคเซ เชฌเซ€เชœเซ€ เชตเช–เชค เชคเซ‡เชจเชพ เชชเชฐ เชตเชงเซ, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชนเชœเซ€ เชคเซˆเชฏเชพเชฐ เชจเชฅเซ€.

เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเชจเซ‡ เชตเชพเชธเซเชคเชตเชฟเช• เชตเซ‡เชฌเชธเซ‹เช•เซ‡เชŸ เชธเชฐเซเชตเชฐเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฎเซ‡เช‚ เชฎเซ‡เชฒเซ‹เชกเซ€ เช—เซ‹ เชชเซ‡เช•เซ‡เชœเชจเชพ เช†เชงเชพเชฐเซ‡ เชธเซŒเชฅเซ€ เชธเชฐเชณ เชฌเชจเชพเชตเซเชฏเซเช‚:

เชธเชฐเซเชตเชฐ เช•เซ‹เชก

package main

import (
	"errors"
	"github.com/go-chi/chi"
	"gopkg.in/olahol/melody.v1"
	"log"
	"net/http"
	"time"
)

func main() {
	r := chi.NewRouter()
	m := melody.New()

	m.Config.MaxMessageSize = 204800

	r.Get("/", func(w http.ResponseWriter, r *http.Request) {
		http.ServeFile(w, r, "public/index.html")
	})
	r.Get("/ws", func(w http.ResponseWriter, r *http.Request) {
		m.HandleRequest(w, r)
	})

         // ะ‘ั€ะพะดะบะฐัั‚ะธะผ ะฒะธะดะตะพ ะฟะพั‚ะพะบ 
	m.HandleMessageBinary(func(s *melody.Session, msg []byte) {
		m.BroadcastBinary(msg)
	})

	log.Println("Starting server...")

	http.ListenAndServe(":3000", r)
}

เช•เซเชฒเชพเชฏเช‚เชŸ (เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เชฌเชพเชœเซ) เชชเชฐ, เชคเชฎเชพเชฐเซ‡ เชชเชนเซ‡เชฒเชพ เช•เซ…เชฎเซ‡เชฐเชพเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฆเซเชตเชพเชฐเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชฎเซ€เชกเชฟเชฏเชพเชธเซเชŸเซเชฐเซ€เชฎ API.

เช…เชฎเซ‡ เช•เซ‡เชฎเซ‡เชฐเชพ/เชฎเชพเชˆเช•เซเชฐเซ‹เชซเซ‹เชจ เชฆเซเชตเชพเชฐเชพ เชเช•เซเชธเซ‡เชธ (เชชเชฐเชตเชพเชจเช—เซ€) เชฎเซ‡เชณเชตเซ€เช เช›เซ€เช เชฎเซ€เชกเชฟเชฏเชพ เช‰เชชเช•เชฐเชฃเซ‹ API. เช† API เชเช• เชชเชฆเซเชงเชคเชฟ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡ MediaDevices.getUserMedia(), เชœเซ‡ เชชเซ‹เชชเช…เชช เชฌเชคเชพเชตเซ‡ เช›เซ‡. เช•เซ…เชฎเซ‡เชฐเชพ เช…เชจเซ‡/เช…เชฅเชตเชพ เชฎเชพเช‡เช•เซเชฐเซ‹เชซเซ‹เชจเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพเชจเซ€ เชชเชฐเชตเชพเชจเช—เซ€ เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชชเซ‚เช›เชคเซ€ เชตเชฟเช‚เชกเซ‹. เชนเซเช‚ เช เชจเซ‹เช‚เชงเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ เชฎเซ‡เช‚ เช—เซ‚เช—เชฒ เช•เซเชฐเซ‹เชฎเชฎเชพเช‚ เชคเชฎเชพเชฎ เชชเซเชฐเชฏเซ‹เช—เซ‹ เช•เชฐเซเชฏเชพ เช›เซ‡, เชชเชฐเช‚เชคเซ เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชซเชพเชฏเชฐเชซเซ‹เช•เซเชธเชฎเชพเช‚ เชฌเชงเซเช‚ เชœ เช•เชพเชฎ เช•เชฐเชถเซ‡.

เช†เช—เชณ, getUserMedia() เชเช• เชตเชšเชจ เช†เชชเซ‡ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชคเซ‡ เชฎเซ€เชกเชฟเชฏเชพเชธเซเชŸเซเชฐเซ€เชฎ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชชเชธเชพเชฐ เช•เชฐเซ‡ เช›เซ‡ - เชตเชฟเชกเชฟเช“-เช‘เชกเชฟเช“ เชกเซ‡เชŸเชพเชจเซ‹ เชธเซเชŸเซเชฐเซ€เชฎ. เช…เชฎเซ‡ เช† เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ‡ เชตเชฟเชกเชฟเชฏเซ‹ เชเชฒเชฟเชฎเซ‡เชจเซเชŸเชจเซ€ src เชชเซเชฐเซ‹เชชเชฐเซเชŸเซ€เชฎเชพเช‚ เช…เชธเชพเช‡เชจ เช•เชฐเซ€เช เช›เซ€เช. เช•เซ‹เชก:

เชชเซเชฐเชธเชพเชฐเชฃ เชฌเชพเชœเซ

<style>
  #videoObjectHtml5ApiServer { width: 320px; height: 240px; background: #666; }
</style>
</head>
<body>
<!-- ะ—ะดะตััŒ ะฒ ัั‚ะพะผ "ะพะบะพัˆะตั‡ะบะต" ะบะปะธะตะฝั‚ ะฑัƒะดะตั‚ ะฒะธะดะตั‚ัŒ ัะตะฑั -->
<video autoplay id="videoObjectHtml5ApiServer"></video>

<script type="application/javascript">
  var
        video = document.getElementById('videoObjectHtml5ApiServer');

// ะตัะปะธ ะดะพัั‚ัƒะฟะตะฝ MediaDevices API, ะฟั‹ั‚ะฐะตะผัั ะฟะพะปัƒั‡ะธั‚ัŒ ะดะพัั‚ัƒะฟ ะบ ะบะฐะผะตั€ะต (ะผะพะถะฝะพ ะตั‰ะต ะธ ะบ ะผะธะบั€ะพั„ะพะฝัƒ)
// getUserMedia ะฒะตั€ะฝะตั‚ ะพะฑะตั‰ะฐะฝะธะต, ะฝะฐ ะบะพั‚ะพั€ะพะต ะฟะพะดะฟะธัั‹ะฒะฐะตะผัั ะธ ะฟะพะปัƒั‡ะตะฝะฝั‹ะน ะฒะธะดะตะพะฟะพั‚ะพะบ ะฒ ะบะพะปะฑะตะบะต ะฝะฐะฟั€ะฐะฒะปัะตะผ ะฒ video ะพะฑัŠะตะบั‚ ะฝะฐ ัั‚ั€ะฐะฝะธั†ะต

if (navigator.mediaDevices.getUserMedia) {
        navigator.mediaDevices.getUserMedia({video: true}).then(function (stream) {
          // ะฒะธะดะตะพ ะฟะพั‚ะพะบ ะฟั€ะธะฒัะทั‹ะฒะฐะตะผ ะบ video ั‚ะตะณัƒ, ั‡ั‚ะพะฑั‹ ะบะปะธะตะฝั‚ ะผะพะณ ะฒะธะดะตั‚ัŒ ัะตะฑั ะธ ะบะพะฝั‚ั€ะพะปะธั€ะพะฒะฐั‚ัŒ 
          video.srcObject = stream;
        });
}
</script>

เชธเซ‹เช•เซ‡เชŸเซเชธ เชชเชฐ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎเชจเซเช‚ เชชเซเชฐเชธเชพเชฐเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชคเซ‡เชจเซ‡ เช•เซเชฏเชพเช‚เช• เชเชจเซเช•เซ‹เชก เช•เชฐเชตเชพเชจเซ€, เชคเซ‡เชจเซ‡ เชฌเชซเชฐ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชญเชพเช—เซ‹เชฎเชพเช‚ เชคเซ‡เชจเซ‡ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช•เชพเชšเซ‹ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎ เชตเซ‡เชฌเชธเซ‹เช•เซ‡เชŸเซเชธ เชฆเซเชตเชพเชฐเชพ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เช•เชฐเซ€ เชถเช•เชพเชคเซ‹ เชจเชฅเซ€. เช† เชคเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เชคเซ‡ เช…เชฎเชพเชฐเซ€ เชธเชนเชพเชฏ เชฎเชพเชŸเซ‡ เช†เชตเซ‡ เช›เซ‡ MediaRecorder API. เช† API เชคเชฎเชจเซ‡ เชธเซเชŸเซเชฐเซ€เชฎเชจเซ‡ เชเชจเซเช•เซ‹เชก เช•เชฐเชตเชพ เช…เชจเซ‡ เชŸเซเช•เชกเชพเช“เชฎเชพเช‚ เชคเซ‹เชกเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เช“เช›เชพ เชฌเชพเช‡เชŸเซเชธ เชฎเซ‹เช•เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชนเซเช‚ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎเชจเซ‡ เชธเช‚เช•เซเชšเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เช•เชฐเซเช‚ เช›เซเช‚. เชคเซ‡เชจเซ‡ เชŸเซเช•เชกเชพเช“เชฎเชพเช‚ เชคเซ‹เชกเซ€เชจเซ‡, เชคเชฎเซ‡ เชฆเชฐเซ‡เช• เชŸเซเช•เชกเชพเชจเซ‡ เชตเซ‡เชฌเชธเซ‹เช•เซ‡เชŸเชฎเชพเช‚ เชฎเซ‹เช•เชฒเซ€ เชถเช•เซ‹ เช›เซ‹. เช•เซ‹เชก:

เช…เชฎเซ‡ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎเชจเซ‡ เชเชจเซเช•เซ‹เชก เช•เชฐเซ€เช เช›เซ€เช, เชคเซ‡เชจเซ‡ เชŸเซเช•เชกเชพเช“เชฎเชพเช‚ เชคเซ‹เชกเซ€เช เช›เซ€เช

<style>
  #videoObjectHtml5ApiServer { width: 320px; height: 240px; background: #666; }
</style>
</head>
<body>
<!-- ะ—ะดะตััŒ ะฒ ัั‚ะพะผ "ะพะบะพัˆะตั‡ะบะต" ะบะปะธะตะฝั‚ ะฑัƒะดะตั‚ ะฒะธะดะตั‚ัŒ ัะตะฑั -->
<video autoplay id="videoObjectHtml5ApiServer"></video>

<script type="application/javascript">
  var
        video = document.getElementById('videoObjectHtml5ApiServer');

// ะตัะปะธ ะดะพัั‚ัƒะฟะตะฝ MediaDevices API, ะฟั‹ั‚ะฐะตะผัั ะฟะพะปัƒั‡ะธั‚ัŒ ะดะพัั‚ัƒะฟ ะบ ะบะฐะผะตั€ะต (ะผะพะถะฝะพ ะตั‰ะต ะธ ะบ ะผะธะบั€ะพั„ะพะฝัƒ)
// getUserMedia ะฒะตั€ะฝะตั‚ ะพะฑะตั‰ะฐะฝะธะต, ะฝะฐ ะบะพั‚ะพั€ะพะต ะฟะพะดะฟะธัั‹ะฒะฐะตะผัั ะธ ะฟะพะปัƒั‡ะตะฝะฝั‹ะน ะฒะธะดะตะพะฟะพั‚ะพะบ ะฒ ะบะพะปะฑะตะบะต ะฝะฐะฟั€ะฐะฒะปัะตะผ ะฒ video ะพะฑัŠะตะบั‚ ะฝะฐ ัั‚ั€ะฐะฝะธั†ะต

if (navigator.mediaDevices.getUserMedia) {
        navigator.mediaDevices.getUserMedia({video: true}).then(function (stream) {
          // ะฒะธะดะตะพ ะฟะพั‚ะพะบ ะฟั€ะธะฒัะทั‹ะฒะฐะตะผ ะบ video ั‚ะตะณัƒ, ั‡ั‚ะพะฑั‹ ะบะปะธะตะฝั‚ ะผะพะณ ะฒะธะดะตั‚ัŒ ัะตะฑั ะธ ะบะพะฝั‚ั€ะพะปะธั€ะพะฒะฐั‚ัŒ 
          video.srcObject = s;
          var
            recorderOptions = {
                mimeType: 'video/webm; codecs=vp8' // ะฑัƒะดะตะผ ะบะพะดะธั€ะพะฒะฐั‚ัŒ ะฒะธะดะตะพะฟะพั‚ะพะบ ะฒ ั„ะพั€ะผะฐั‚ webm ะบะพะดะตะบะพะผ vp8
              },
              mediaRecorder = new MediaRecorder(s, recorderOptions ); // ะพะฑัŠะตะบั‚ MediaRecorder

               mediaRecorder.ondataavailable = function(e) {
                if (e.data && e.data.size > 0) {
                  // ะฟะพะปัƒั‡ะฐะตะผ ะบัƒัะพั‡ะตะบ ะฒะธะดะตะพะฟะพั‚ะพะบะฐ ะฒ e.data
                }
            }

            mediaRecorder.start(100); // ะดะตะปะธั‚ ะฟะพั‚ะพะบ ะฝะฐ ะบัƒัะพั‡ะบะธ ะฟะพ 100 ะผั ะบะฐะถะดั‹ะน

        });
}
</script>

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชตเซ‡เชฌเชธเซ‹เช•เซ‡เชŸเซเชธ เชฆเซเชตเชพเชฐเชพ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เช‰เชฎเซ‡เชฐเซ€เช. เช†เชถเซเชšเชฐเซเชฏเชœเชจเช• เชฐเซ€เชคเซ‡, เช† เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เชซเช•เซเชค เชเช• เชตเชธเซเชคเซเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชตเซ‡เชฌเชธเซ‹เช•เซ‡เชŸ. เชคเซ‡เชจเซ€ เชชเชพเชธเซ‡ เชฎเซ‹เช•เชฒเชตเชพ เช…เชจเซ‡ เชฌเช‚เชง เช•เชฐเชตเชพเชจเซ€ เชฎเชพเชคเซเชฐ เชฌเซ‡ เชชเชฆเซเชงเชคเชฟเช“ เช›เซ‡. เชจเชพเชฎเซ‹ เชชเซ‹เชคเชพเชจเซ‡ เชฎเชพเชŸเซ‡ เชฌเซ‹เชฒเซ‡ เช›เซ‡. เช‰เชฎเซ‡เชฐเชพเชฏเซ‡เชฒ เช•เซ‹เชก:

เช…เชฎเซ‡ เชธเชฐเซเชตเชฐ เชชเชฐ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เช•เชฐเซ€เช เช›เซ€เช

<style>
  #videoObjectHtml5ApiServer { width: 320px; height: 240px; background: #666; }
</style>
</head>
<body>
<!-- ะ—ะดะตััŒ ะฒ ัั‚ะพะผ "ะพะบะพัˆะตั‡ะบะต" ะบะปะธะตะฝั‚ ะฑัƒะดะตั‚ ะฒะธะดะตั‚ัŒ ัะตะฑั -->
<video autoplay id="videoObjectHtml5ApiServer"></video>

<script type="application/javascript">
  var
        video = document.getElementById('videoObjectHtml5ApiServer');

// ะตัะปะธ ะดะพัั‚ัƒะฟะตะฝ MediaDevices API, ะฟั‹ั‚ะฐะตะผัั ะฟะพะปัƒั‡ะธั‚ัŒ ะดะพัั‚ัƒะฟ ะบ ะบะฐะผะตั€ะต (ะผะพะถะฝะพ ะตั‰ะต ะธ ะบ ะผะธะบั€ะพั„ะพะฝัƒ)
// getUserMedia ะฒะตั€ะฝะตั‚ ะพะฑะตั‰ะฐะฝะธะต, ะฝะฐ ะบะพั‚ะพั€ะพะต ะฟะพะดะฟะธัั‹ะฒะฐะตะผัั ะธ ะฟะพะปัƒั‡ะตะฝะฝั‹ะน ะฒะธะดะตะพะฟะพั‚ะพะบ ะฒ ะบะพะปะฑะตะบะต ะฝะฐะฟั€ะฐะฒะปัะตะผ ะฒ video ะพะฑัŠะตะบั‚ ะฝะฐ ัั‚ั€ะฐะฝะธั†ะต

if (navigator.mediaDevices.getUserMedia) {
        navigator.mediaDevices.getUserMedia({video: true}).then(function (stream) {
          // ะฒะธะดะตะพ ะฟะพั‚ะพะบ ะฟั€ะธะฒัะทั‹ะฒะฐะตะผ ะบ video ั‚ะตะณัƒ, ั‡ั‚ะพะฑั‹ ะบะปะธะตะฝั‚ ะผะพะณ ะฒะธะดะตั‚ัŒ ัะตะฑั ะธ ะบะพะฝั‚ั€ะพะปะธั€ะพะฒะฐั‚ัŒ 
          video.srcObject = s;
          var
            recorderOptions = {
                mimeType: 'video/webm; codecs=vp8' // ะฑัƒะดะตะผ ะบะพะดะธั€ะพะฒะฐั‚ัŒ ะฒะธะดะตะพะฟะพั‚ะพะบ ะฒ ั„ะพั€ะผะฐั‚ webm ะบะพะดะตะบะพะผ vp8
              },
              mediaRecorder = new MediaRecorder(s, recorderOptions ), // ะพะฑัŠะตะบั‚ MediaRecorder
              socket = new WebSocket('ws://127.0.0.1:3000/ws');

               mediaRecorder.ondataavailable = function(e) {
                if (e.data && e.data.size > 0) {
                  // ะฟะพะปัƒั‡ะฐะตะผ ะบัƒัะพั‡ะตะบ ะฒะธะดะตะพะฟะพั‚ะพะบะฐ ะฒ e.data
                 socket.send(e.data);
                }
            }

            mediaRecorder.start(100); // ะดะตะปะธั‚ ะฟะพั‚ะพะบ ะฝะฐ ะบัƒัะพั‡ะบะธ ะฟะพ 100 ะผั ะบะฐะถะดั‹ะน

        }).catch(function (err) { console.log(err); });
}
</script>

เชชเซเชฐเชธเชพเชฐเชฃ เชฌเชพเชœเซ เชคเซˆเชฏเชพเชฐ เช›เซ‡! เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช•เซเชฒเชพเชฏเช‚เชŸ เชชเชฐ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเซ€เช. เช† เชฎเชพเชŸเซ‡ เช†เชชเชฃเชจเซ‡ เชถเซเช‚ เชœเซ‹เชˆเช เช›เซ‡? เชชเซเชฐเชฅเชฎ, เช…เชฒเชฌเชคเซเชค, เชธเซ‹เช•เซ‡เชŸ เช•เชจเซ‡เช•เซเชถเชจ. เช…เชฎเซ‡ WebSocket เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชธเชพเชฅเซ‡ "เชถเซเชฐเซ‹เชคเชพ" เชœเซ‹เชกเซ€เช เช›เซ€เช เช…เชจเซ‡ 'เชธเช‚เชฆเซ‡เชถ' เช‡เชตเซ‡เชจเซเชŸเชฎเชพเช‚ เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌ เช•เชฐเซ€เช เช›เซ€เช. เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชกเซ‡เชŸเชพเชจเซ‹ เชŸเซเช•เชกเซ‹ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช…เชฎเชพเชฐเซเช‚ เชธเชฐเซเชตเชฐ เชคเซ‡เชจเซ‡ เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌเชฐเซเชธ, เชเชŸเชฒเซ‡ เช•เซ‡ เช—เซเชฐเชพเชนเช•เซ‹เชจเซ‡ เชชเซเชฐเชธเชพเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, 'เชธเช‚เชฆเซ‡เชถ' เช‡เชตเซ‡เชจเซเชŸเชจเชพ "เชถเซเชฐเซ‹เชคเชพ" เชธเชพเชฅเซ‡ เชธเช‚เช•เชณเชพเชฏเซ‡เชฒ เช•เซ‰เชฒเชฌเซ‡เช• เชซเช‚เช•เซเชถเชจ เช•เซเชฒเชพเชฏเช‚เชŸ เชชเชฐ เชŸเซเชฐเชฟเช—เชฐ เชฅเชพเชฏ เช›เซ‡; เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชชเซ‹เชคเซ‡ เชซเช‚เช•เซเชถเชจ เชฆเชฒเซ€เชฒเชฎเชพเช‚ เชชเชธเชพเชฐ เชฅเชพเชฏ เช›เซ‡ - vp8 เชฆเซเชตเชพเชฐเชพ เชเชจเซเช•เซ‹เชก เช•เชฐเชพเชฏเซ‡เชฒ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎเชจเซ‹ เชเช• เชญเชพเช—.

เช…เชฎเซ‡ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎ เชธเซเชตเซ€เช•เชพเชฐเซ€เช เช›เซ€เช

<style>
  #videoObjectHtml5ApiServer { width: 320px; height: 240px; background: #666; }
</style>
</head>
<body>
<!-- ะ—ะดะตััŒ ะฒ ัั‚ะพะผ "ะพะบะพัˆะตั‡ะบะต" ะบะปะธะตะฝั‚ ะฑัƒะดะตั‚ ะฒะธะดะตั‚ัŒ ั‚ะตะฑั -->
<video autoplay id="videoObjectHtml5ApiServer"></video>

<script type="application/javascript">
  var
        video = document.getElementById('videoObjectHtml5ApiServer'),
         socket = new WebSocket('ws://127.0.0.1:3000/ws'), 
         arrayOfBlobs = [];

         socket.addEventListener('message', function (event) {
                // "ะบะปะฐะดะตะผ" ะฟะพะปัƒั‡ะตะฝะฝั‹ะน ะบัƒัะพั‡ะตะบ ะฒ ะผะฐััะธะฒ 
                arrayOfBlobs.push(event.data);
                // ะทะดะตััŒ ะฑัƒะดะตะผ ั‡ะธั‚ะฐั‚ัŒ ะบัƒัะพั‡ะบะธ
                readChunk();
            });
</script>

เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏ เชธเซเชงเซ€ เชฎเซ‡เช‚ เช เชธเชฎเชœเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซเชฏเซ‹ เช•เซ‡ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซ‡เชฒเชพ เชŸเซเช•เชกเชพเช“เชจเซ‡ เชชเซเชฒเซ‡เชฌเซ‡เช• เชฎเชพเชŸเซ‡ เชตเชฟเชกเชฟเชฏเซ‹ เชเชฒเชฟเชฎเซ‡เชจเซเชŸ เชชเชฐ เชคเชฐเชค เชœ เชฎเซ‹เช•เชฒเชตเชพเชจเซเช‚ เช•เซ‡เชฎ เช…เชถเช•เซเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เชฌเชนเชพเชฐ เช†เชตเซเชฏเซเช‚ เช•เซ‡ เช† เช•เชฐเซ€ เชถเช•เชพเชคเซเช‚ เชจเชฅเซ€, เช…เชฒเชฌเชคเซเชค, เชคเชฎเชพเชฐเซ‡ เชชเชนเซ‡เชฒเชพ เชญเชพเช—เชจเซ‡ เชฌเช‚เชงเชพเชฏเซ‡เชฒเชพ เชตเชฟเชถเชฟเชทเซเชŸ เชฌเชซเชฐเชฎเชพเช‚ เชฎเซ‚เช•เชตเซ‹ เช†เชตเชถเซเชฏเช• เช›เซ‡. เชตเชฟเชกเซ€เชฏเซ‹ เชคเชคเซเชต, เช…เชจเซ‡ เชคเซ‡ เชชเช›เซ€ เชœ เชคเซ‡ เชตเชฟเชกเซ€เชฏเซ‹ เชธเซเชŸเซเชฐเซ€เชฎ เชšเชฒเชพเชตเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเชถเซ‡. เช† เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡ เชฎเซ€เชกเชฟเชฏเชพเชธเซ‹เชฐเซเชธ API ะธ เชซเชพเช‡เชฒเชฐเซ€เชกเชฐ API.

เชฎเซ€เชกเชฟเชฏเชพเชธเซ‹เชฐเซเชธ เชฎเซ€เชกเชฟเชฏเชพ เชชเซเชฒเซ‡เชฌเซ‡เช• เช‘เชฌเซเชœเซ‡เช•เซเชŸ เช…เชจเซ‡ เช† เชฎเซ€เชกเชฟเชฏเชพ เชธเซเชŸเซเชฐเซ€เชฎเชจเชพ เชธเซเชคเซเชฐเซ‹เชค เชตเชšเซเชšเซ‡ เชเช• เชชเซเชฐเช•เชพเชฐเชจเชพ เชฎเชงเซเชฏเชธเซเชฅเซ€ เชคเชฐเซ€เช•เซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡. เชฎเซ€เชกเชฟเชฏเชพเชธเซ‹เชฐเซเชธ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชตเชฟเชกเชฟเช“/เช‘เชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎเชจเชพ เชธเซเชคเซเชฐเซ‹เชค เชฎเชพเชŸเซ‡ เชชเซเชฒเช— เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเซเช‚ เชฌเชซเชฐ เช›เซ‡. เชเช• เชตเชฟเชถเซ‡เชทเชคเชพ เช เช›เซ‡ เช•เซ‡ เชฌเชซเชฐ เชซเช•เซเชค Uint8 เชกเซ‡เชŸเชพเชจเซ‡ เชชเช•เชกเซ€ เชถเช•เซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เชคเชฎเชพเชฐเซ‡ เช†เชตเชพ เชฌเชซเชฐ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชซเชพเช‡เชฒเชฐเซ€เชกเชฐเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เช•เซ‹เชก เชœเซเช“ เช…เชจเซ‡ เชคเซ‡ เชตเชงเซ เชธเซเชชเชทเซเชŸ เชฅเชˆ เชœเชถเซ‡:

เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎ เชšเชฒเชพเชตเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ€เช

<style>
  #videoObjectHtml5ApiServer { width: 320px; height: 240px; background: #666; }
</style>
</head>
<body>
<!-- ะ—ะดะตััŒ ะฒ ัั‚ะพะผ "ะพะบะพัˆะตั‡ะบะต" ะบะปะธะตะฝั‚ ะฑัƒะดะตั‚ ะฒะธะดะตั‚ัŒ ั‚ะตะฑั -->
<video autoplay id="videoObjectHtml5ApiServer"></video>

<script type="application/javascript">
  var
        video = document.getElementById('videoObjectHtml5ApiServer'),
         socket = new WebSocket('ws://127.0.0.1:3000/ws'),
        mediaSource = new MediaSource(), // ะพะฑัŠะตะบั‚ MediaSource
        vid2url = URL.createObjectURL(mediaSource), // ัะพะทะดะฐะตะผ ะพะฑัŠะตะบั‚ URL ะดะปั ัะฒัะทั‹ะฒะฐะฝะธั ะฒะธะดะตะพะฟะพั‚ะพะบะฐ ั ะฟั€ะพะธะณั€ั‹ะฒะฐั‚ะตะปะตะผ
        arrayOfBlobs = [],
        sourceBuffer = null; // ะฑัƒั„ะตั€, ะฟะพะบะฐ ะฝัƒะปัŒ-ะพะฑัŠะตะบั‚

         socket.addEventListener('message', function (event) {
                // "ะบะปะฐะดะตะผ" ะฟะพะปัƒั‡ะตะฝะฝั‹ะน ะบัƒัะพั‡ะตะบ ะฒ ะผะฐััะธะฒ 
                arrayOfBlobs.push(event.data);
                // ะทะดะตััŒ ะฑัƒะดะตะผ ั‡ะธั‚ะฐั‚ัŒ ะบัƒัะพั‡ะบะธ
                readChunk();
            });

         // ะบะฐะบ ั‚ะพะปัŒะบะพ MediaSource ะฑัƒะดะตั‚ ะพะฟะพะฒะตั‰ะตะฝ , ั‡ั‚ะพ ะธัั‚ะพั‡ะฝะธะบ ะณะพั‚ะพะฒ ะพั‚ะดะฐะฒะฐั‚ัŒ ะบัƒัะพั‡ะบะธ 
        // ะฒะธะดะตะพ/ะฐัƒะดะธะพ ะฟะพั‚ะพะบะฐ
        // ัะพะทะดะฐะตะผ ะฑัƒั„ะตั€ , ัะปะตะดัƒะตั‚ ะพะฑั€ะฐั‚ะธั‚ัŒ ะฒะฝะธะผะฐะฝะธะต, ั‡ั‚ะพ ะฑัƒั„ะตั€ ะดะพะปะถะตะฝ ะทะฝะฐั‚ัŒ ะฒ ะบะฐะบะพะผ ั„ะพั€ะผะฐั‚ะต 
        // ะบะฐะบะธะผ ะบะพะดะตะบะพะผ ะฑั‹ะป ะทะฐะบะพะดะธั€ะพะฒะฐะฝ ะฟะพั‚ะพะบ, ั‡ั‚ะพะฑั‹ ั‚ะตะผ ะถะต ัะฟะพัะพะฑะพะผ ะฟั€ะพั‡ะธั‚ะฐั‚ัŒ ะฒะธะดะตะพะฟะพั‚ะพะบ
         mediaSource.addEventListener('sourceopen', function() {
            var mediaSource = this;
            sourceBuffer = mediaSource.addSourceBuffer("video/webm; codecs="vp8"");
        });

      function readChunk() {
        var reader = new FileReader();
        reader.onload = function(e) { 
          // ะบะฐะบ ั‚ะพะปัŒะบะพ FileReader ะฑัƒะดะตั‚ ะณะพั‚ะพะฒ, ะธ ะทะฐะณั€ัƒะทะธั‚ ัะตะฑะต ะบัƒัะพั‡ะตะบ ะฒะธะดะตะพะฟะพั‚ะพะบะฐ
          // ะผั‹ "ะฟั€ะธั†ะตะฟะปัะตะผ" ะฟะตั€ะตะบะพะดะธั€ะพะฒะฐะฝะฝั‹ะน ะฒ Uint8Array (ะฑั‹ะป Blob) ะบัƒัะพั‡ะตะบ ะฒ ะฑัƒั„ะตั€, ัะฒัะทะฐะฝะฝั‹ะน
          // ั ะฟั€ะพะธะณั€ั‹ะฒะฐั‚ะตะปะตะผ, ะธ ะฟั€ะพะธะณั€ั‹ะฒะฐั‚ะตะปัŒ ะฝะฐั‡ะธะฝะฐะตั‚ ะฒะพัะฟั€ะพะธะทะฒะพะดะธั‚ัŒ ะฟะพะปัƒั‡ะตะฝะฝั‹ะน ะบัƒัะพั‡ะตะบ ะฒะธะดะตะพ/ะฐัƒะดะธะพ
          sourceBuffer.appendBuffer(new Uint8Array(e.target.result));

          reader.onload = null;
        }
        reader.readAsArrayBuffer(arrayOfBlobs.shift());
      }
</script>

เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เชธเซ‡เชตเชพเชจเซ‹ เชชเซเชฐเซ‹เชŸเซ‹เชŸเชพเช‡เชช เชคเซˆเชฏเชพเชฐ เช›เซ‡. เชฎเซเช–เซเชฏ เช—เซ‡เชฐเชฒเชพเชญ เช เช›เซ‡ เช•เซ‡ เชตเชฟเชกเชฟเชฏเซ‹ เชชเซเชฒเซ‡เชฌเซ‡เช• เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸเชฟเช‚เช— เชฌเชพเชœเซเชฅเซ€ 100 ms เชชเชพเช›เชณ เชฐเชนเซ‡เชถเซ‡; เชธเชฐเซเชตเชฐ เชชเชฐ เชชเซเชฐเชธเชพเชฐเชฟเชค เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ เชตเชฟเชกเชฟเชฏเซ‹ เชธเซเชŸเซเชฐเซ€เชฎเชจเซ‡ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช…เชฎเซ‡ เช† เชœเชพเชคเซ‡ เชธเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช. เชคเชฆเซเชชเชฐเชพเช‚เชค, เชœเซเชฏเชพเชฐเซ‡ เชฎเซ‡เช‚ เชฎเชพเชฐเชพ เชฒเซ‡เชชเชŸเซ‹เชช เชชเชฐ เชคเชชเชพเชธ เช•เชฐเซ€, เชคเซเชฏเชพเชฐเซ‡ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸเชฟเช‚เช— เช…เชจเซ‡ เชฐเซ€เชธเซ€เชตเชฟเช‚เช— เชฌเชพเชœเซเช“ เชตเชšเซเชšเซ‡เชจเซ‹ เช…เช‚เชคเชฐ เชงเซ€เชฎเซ‡ เชงเซ€เชฎเซ‡ เชธเช‚เชšเชฟเชค เชฅเชฏเซ‹, เช† เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชฆเซ‡เช–เชพเชคเซเช‚ เชนเชคเซเช‚. เชฎเซ‡เช‚ เช† เช—เซ‡เชฐเชฒเชพเชญเชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเชตเชพเชจเชพ เชฐเชธเซเชคเชพเช“ เชถเซ‹เชงเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚, เช…เชจเซ‡... RTCPeerConnection API, เชœเซ‡ เชคเชฎเชจเซ‡ เชธเซเชŸเซเชฐเซ€เชฎเชจเซ‡ เชŸเซเช•เชกเชพเช“เชฎเชพเช‚ เชตเชฟเชญเชพเชœเซ€เชค เช•เชฐเชตเชพ เชœเซ‡เชตเซ€ เชฏเซเช•เซเชคเชฟเช“ เชตเชฟเชจเชพ เชตเชฟเชกเชฟเช“ เชธเซเชŸเซเชฐเซ€เชฎ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชธเช‚เชšเชฟเชค เชฒเซ‡เช— เช เชนเช•เซ€เช•เชคเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช›เซ‡ เช•เซ‡ เชฌเซเชฐเชพเช‰เชเชฐ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชชเชนเซ‡เชฒเชพเช‚ เชฆเชฐเซ‡เช• เชญเชพเช—เชจเซ‡ เชตเซ‡เชฌเชเชฎ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชซเชฐเซ€เชฅเซ€ เชเชจเซเช•เซ‹เชก เช•เชฐเซ‡ เช›เซ‡. เชฎเซ‡เช‚ เชตเชงเซ เช–เซ‹เชฆเช•เชพเชฎ เช•เชฐเซเชฏเซเช‚ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ WebRTC เชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚. เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‹ เชฎเชจเซ‡ เชคเซ‡ เชธเชฎเซเชฆเชพเชฏ เชฎเชพเชŸเซ‡ เชฐเชธเชชเซเชฐเชฆ เชฒเชพเช—เชถเซ‡ เชคเซ‹ เชนเซเช‚ เชฎเชพเชฐเชพ เชธเช‚เชถเซ‹เชงเชจเชจเชพเช‚ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชตเชฟเชถเซ‡ เชเช• เช…เชฒเช— เชฒเซ‡เช– เชฒเช–เซ€เชถ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹