(เดเดคเดพเดฃเตเดŸเต) เด’เดฐเต เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด‰เดชเดฏเต‹เด—เดถเต‚เดจเตเดฏเดฎเดพเดฏ เดตเต†เดฌเตโ€Œเด•เตเดฏเดพเด‚ เดธเตเดŸเตเดฐเต€เดฎเดฟเด‚เด—เต. เดฎเต€เดกเดฟเดฏ เดธเตเดŸเตเดฐเต€เดฎเตเด‚ เดตเต†เดฌเตโ€Œเดธเต‹เด•เตเด•เดฑเตเดฑเตเด•เดณเตเด‚

Adobe Flash Player เดชเต‹เดฒเตเดณเตเดณ เดฎเต‚เดจเตเดจเดพเด‚ เด•เด•เตเดทเดฟ เดฌเตเดฐเต—เดธเตผ เดชเตเดฒเด—เดฟเดจเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดคเต† เดตเต†เดฌเตโ€Œเดธเต‹เด•เตเด•เดฑเตเดฑเตเด•เตพ เดตเดดเดฟ เดตเต€เดกเดฟเดฏเต‹ เดธเตเดŸเตเดฐเต€เด‚ เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เดŽเดจเตเดฑเต† เดถเตเดฐเดฎเด™เตเด™เตพ เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดชเด™เตเด•เดฟเดŸเดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดคเดฟเตฝ เดŽเดจเตเดคเดพเดฃเต เดตเดจเตเดจเดคเต†เดจเตเดจเต เด…เดฑเดฟเดฏเดพเตป เดตเดพเดฏเดฟเด•เตเด•เตเด•.

เด…เดกเต‹เดฌเต เดซเตเดฒเดพเดทเต, เดฎเตเดฎเตเดชเต เดฎเดพเด•เตเดฐเต‹เดฎเต€เดกเดฟเดฏ เดซเตเดฒเดพเดทเต, เด’เดฐเต เดตเต†เดฌเต เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดชเตเดฒเดพเดฑเตเดฑเตเดซเต‹เดฎเดพเดฃเต. เดฎเต€เดกเดฟเดฏ เดธเตเดŸเตเดฐเต€เด‚ API เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต, เด’เดฐเต เดตเต†เดฌเตโ€Œเด•เตเดฏเดพเดฎเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเต€เดกเดฟเดฏเต‹เดฏเตเด‚ เดตเต‹เดฏเดฟเดธเตเด‚ เดธเตเดŸเตเดฐเต€เด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เดตเดฟเดตเดฟเดง เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เด•เต‹เตบเดซเดฑเตปเดธเตเด•เดณเตเด‚ เดšเดพเดฑเตเดฑเตเด•เดณเตเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต‡เดฏเตŠเดฐเต เดชเตเดฒเดพเดฑเตเดฑเตเดซเต‹เดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต เด‡เดคเต. เดฎเต€เดกเดฟเดฏ เดตเดฟเดตเดฐเด™เตเด™เตพ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ RTMP (เดฑเดฟเดฏเตฝ เดŸเตˆเด‚ เดฎเต†เดธเต‡เดœเดฟเด‚เด—เต เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ) เดตเดณเดฐเต†เด•เตเด•เดพเดฒเดฎเดพเดฏเดฟ เด…เดŸเดšเตเดšเดฟเดฐเตเดจเตเดจเต, เด…เดคเดฟเดจเตผเดคเตเดฅเด‚: เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดŸเตเดฐเต€เดฎเดฟเด‚เด—เต เดธเต‡เดตเดจเด‚ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เด™เตเด•เดฟเตฝ, Adobe-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดธเต‹เดซเตโ€Œเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฆเดฏ เด•เดพเดฃเดฟเด•เตเด•เตเด• - Adobe Media Server (AMS).

2012-เตฝ เด•เตเดฑเดšเตเดšเต เดธเดฎเดฏเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚, เด…เดกเต‹เดฌเต เดชเตŠเดคเตเดœเดจเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ "เด‰เดชเต‡เด•เตเดทเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดคเตเดชเตเดชเตเด•เดฏเตเด‚" เดšเต†เดฏเตเดคเต. เดธเตเดชเต†เดธเดฟเดซเดฟเด•เตเด•เต‡เดทเตป RTMP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ, เด…เดคเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เด…เดŸเด™เตเด™เดฟเดฏเดคเตเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจเดชเดฐเดฎเดพเดฏเดฟ เด…เดชเต‚เตผเดฃเตเดฃเดตเตเดฎเดพเดฃเต. เด…เดชเตเดชเต‹เดดเต‡เด•เตเด•เตเด‚, เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดˆ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดฟ, เด•เต‚เดŸเดพเดคเต† Wowza เดธเต†เตผเดตเตผ เดชเตเดฐเดคเตเดฏเด•เตเดทเดชเตเดชเต†เดŸเตเดŸเต. 2011-เตฝ, RTMP-เดฏเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เดชเต‡เดฑเตเดฑเดจเตเดฑเตเด•เตพ เดจเดฟเดฏเดฎเดตเดฟเดฐเตเดฆเตเดงเดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดคเดฟเดจเต Wowza เดฏเตโ€Œเด•เตเด•เต†เดคเดฟเดฐเต† Adobe เด’เดฐเต เด•เต‡เดธเต เดซเดฏเตฝ เดšเต†เดฏเตเดคเต; 4 เดตเตผเดทเดคเตเดคเดฟเดจเตเดถเต‡เดทเด‚, เดธเด‚เด˜เตผเดทเด‚ เดฐเดฎเตเดฏเดฎเดพเดฏเดฟ เดชเดฐเดฟเดนเดฐเดฟเดšเตเดšเต.

เด…เดกเต‹เดฌเต เดซเตเดฒเดพเดทเต เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เดฎเดฟเดจเต 20 เดตเตผเดทเดคเตเดคเดฟเดฒเต‡เดฑเต† เดชเดดเด•เตเด•เดฎเตเดฃเตเดŸเต, เดˆ เดธเดฎเดฏเดคเตเดคเต เดจเดฟเดฐเดตเดงเดฟ เด—เตเดฐเตเดคเดฐเดฎเดพเดฏ เด•เต‡เดŸเตเดชเดพเดŸเตเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต, เดชเดฟเดจเตเดคเตเดฃ เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดคเต 2020-เด“เดŸเต† เด…เดตเดธเดพเดจเดฟเด•เตเด•เตเด‚, เดธเตเดŸเตเดฐเต€เดฎเดฟเด‚เด—เต เดธเต‡เดตเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เด•เตเดฑเดšเตเดšเต เดฌเดฆเดฒเตเด•เตพ เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเต.

เดŽเดจเตเดฑเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ, เดฌเตเดฐเต—เดธเดฑเดฟเดฒเต† เดซเตเดฒเดพเดทเดฟเดจเตเดฑเต† เด‰เดชเดฏเต‹เด—เด‚ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เด‰เดชเต‡เด•เตเดทเดฟเด•เตเด•เดพเตป เดžเดพเตป เด‰เดŸเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต. เดฎเตเด•เดณเดฟเดฒเตเดณเตเดณ เดชเตเดฐเดงเดพเดจ เด•เดพเดฐเดฃเด‚ เดžเดพเตป เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเต; เดฎเตŠเดฌเตˆเตฝ เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เดฎเตเด•เดณเดฟเตฝ เดซเตเดฒเดพเดทเตเด‚ เดชเดฟเดจเตเดคเตเดฃเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เด•เต‚เดŸเดพเดคเต† เดตเดฟเตปเดกเต‹เดธเดฟเตฝ (เดตเตˆเตป เดŽเดฎเตเดฒเต‡เดฑเตเดฑเตผ) เดตเดฟเด•เดธเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เด…เดกเต‹เดฌเต เดซเตเดฒเดพเดทเต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเตป เดžเดพเตป เดถเดฐเดฟเด•เตเด•เตเด‚ เด†เด—เตเดฐเดนเดฟเดšเตเดšเดฟเดฒเตเดฒ. เด…เด™เตเด™เดจเต† เดžเดพเตป เดœเดพเดตเดพเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเตฝ เด’เดฐเต เด•เตเดฒเดฏเดจเตเดฑเต เดŽเดดเตเดคเดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต. เด‡เดคเต เด’เดฐเต เดชเตเดฐเต‹เดŸเตเดŸเต‹เดŸเตˆเดชเตเดชเต เดฎเดพเดคเตเดฐเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เด•เดพเดฐเดฃเด‚ 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>

เดธเต‹เด•เตเด•เดฑเตเดฑเตเด•เดณเดฟเตฝ เด’เดฐเต เดตเต€เดกเดฟเดฏเต‹ เดธเตเดŸเตเดฐเต€เด‚ เดชเตเดฐเด•เตเดทเต‡เดชเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพ เด…เดคเต เดŽเดตเดฟเดŸเต†เดฏเต†เด™เตเด•เดฟเดฒเตเด‚ เดŽเตปเด•เต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดฌเดซเตผ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดญเดพเด—เด™เตเด™เดณเดพเดฏเดฟ เด•เตˆเดฎเดพเดฑเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด…เดธเด‚เดธเตโ€Œเด•เตƒเดค เดตเต€เดกเดฟเดฏเต‹ เดธเตเดŸเตเดฐเต€เด‚ เดตเต†เดฌเตโ€Œเดธเต‹เด•เตเด•เดฑเตเดฑเตเด•เตพ เดตเดดเดฟ เด•เตˆเดฎเดพเดฑเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ. เด‡เดตเดฟเดŸเต†เดฏเดพเดฃเต เดจเดฎเตเดฎเตเดŸเต† เดธเดนเดพเดฏเดคเตเดคเดฟเดจเต เดŽเดคเตเดคเตเดจเตเดจเดคเต เดฎเต€เดกเดฟเดฏ เดฑเต†เด•เตเด•เต‹เตผเดกเตผ 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 เดŽเด‚เดŽเดธเต เดชเดฟเดจเตเดจเดฟเดฒเดพเด•เตเด‚ เดŽเดจเตเดจเดคเดพเดฃเต เดชเตเดฐเดงเดพเดจ เดชเต‹เดฐเดพเดฏเตเดฎ; เดธเต†เตผเดตเดฑเดฟเดฒเต‡เด•เตเด•เต เด•เตˆเดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เดตเต€เดกเดฟเดฏเต‹ เดธเตเดŸเตเดฐเต€เด‚ เดตเดฟเดญเดœเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดžเด™เตเด™เตพ เด‡เดคเต เดธเตเดตเดฏเด‚ เดธเดœเตเดœเดฎเดพเด•เตเด•เตเดจเตเดจเต. เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดŽเดจเตเดฑเต† เดฒเดพเดชเตโ€ŒเดŸเต‹เดชเตเดชเดฟเตฝ เดžเดพเตป เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดšเดชเตเดชเต‹เตพ, เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเตเดฎเดพเดฏ เดตเดถเด™เตเด™เตพเด•เตเด•เดฟเดŸเดฏเดฟเดฒเตเดณเตเดณ เด•เดพเดฒเดคเดพเดฎเดธเด‚ เด•เตเดฐเดฎเต‡เดฃ เด…เดŸเดฟเดžเตเดžเตเด•เต‚เดŸเดฟ, เด‡เดคเต เดตเตเดฏเด•เตเดคเดฎเดพเดฏเดฟ เด•เดพเดฃเดพเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต. เดˆ เดชเต‹เดฐเดพเดฏเตเดฎเดฏเต† เดฎเดฑเดฟเด•เดŸเด•เตเด•เดพเตป เดžเดพเตป เดตเดดเดฟเด•เตพ เดคเต‡เดŸเดพเตป เดคเตเดŸเด™เตเด™เดฟ, เด’เดชเตเดชเด‚ ... เด•เดฃเตเดŸเต RTCPeerConnection API, เดธเตเดŸเตเดฐเต€เด‚ เด•เดทเดฃเด™เตเด™เดณเดพเดฏเดฟ เดตเดฟเดญเดœเดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเต‹เดฒเตเดณเตเดณ เดคเดจเตเดคเตเดฐเด™เตเด™เดณเดฟเดฒเตเดฒเดพเดคเต† เด’เดฐเต เดตเต€เดกเดฟเดฏเต‹ เดธเตเดŸเตเดฐเต€เด‚ เด•เตˆเดฎเดพเดฑเดพเตป เด‡เดคเต เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เดชเตเดฐเด•เตเดทเต‡เดชเดฃเดคเตเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เดฌเตเดฐเต—เดธเตผ เด“เดฐเต‹ เดญเดพเด—เดตเตเด‚ เดตเต†เดฌเตโ€ŒเดŽเด‚ เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดตเต€เดฃเตเดŸเตเด‚ เดŽเตปเด•เต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดพเดฃเต เด•เตเดฎเดฟเดžเตเดžเตเด•เต‚เดŸเตเดจเตเดจ เด•เดพเดฒเดคเดพเดฎเดธเดคเตเดคเดฟเดจเต เด•เดพเดฐเดฃเดฎเต†เดจเตเดจเต เดžเดพเตป เด•เดฐเตเดคเตเดจเตเดจเต. เดžเดพเตป เด•เต‚เดŸเตเดคเตฝ เด•เตเดดเดฟเดšเตเดšเดฟเดฒเตเดฒ, เดชเด•เตเดทเต‡ เดตเต†เดฌเตโ€Œเด†เตผโ€ŒเดŸเดฟโ€Œเดธเดฟ เดชเด เดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดฟ. เดŽเดจเตเดฑเต† เด—เดตเต‡เดทเดฃ เดซเดฒเด™เตเด™เตพ เดธเดฎเต‚เดนเดคเตเดคเดฟเดจเต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดฃเตเดŸเต†เดจเตเดจเต เดคเต‹เดจเตเดจเดฟเดฏเดพเตฝ เด…เดคเดฟเดจเต† เด•เตเดฑเดฟเดšเตเดšเต เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดฒเต‡เด–เดจเด‚ เดŽเดดเตเดคเดพเดฎเต†เดจเตเดจเต เดžเดพเตป เด•เดฐเตเดคเตเดจเตเดจเต.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•