เช เชฒเซเชเชฎเชพเช เชนเซเช Adobe Flash Player เชเซเชตเชพ เชคเซเชคเซเชฏ-เชชเชเซเชท เชฌเซเชฐเชพเชเชเชฐ เชชเซเชฒเชเชฟเชจเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซเชฏเชพ เชตเชฟเชจเชพ เชตเซเชฌเชธเซเชเซเชเซเชธ เชฆเซเชตเชพเชฐเชพ เชตเชฟเชกเชฟเช เชธเซเชเซเชฐเซเชฎ เชเชฐเชตเชพเชจเชพ เชฎเชพเชฐเชพ เชชเซเชฐเชฏเชพเชธเซเชจเซ เชถเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเชเซ เชเซเช. เชคเซเชฎเชพเชเชฅเซ เชถเซเช เชเชตเซเชฏเซเช เชคเซ เชเชพเชฃเชตเชพ เชฎเชพเชเซ เชเชเชณ เชตเชพเชเชเซ.
Adobe Flash, เช
เชเชพเช Macromedia Flash, เชตเซเชฌ เชฌเซเชฐเชพเชเชเชฐเชฎเชพเช เชเชพเชฒเชคเซ เชเชชเซเชฒเชฟเชเซเชถเชจเซเชธ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซเชจเซเช เชชเซเชฒเซเชเชซเซเชฐเซเชฎ เชเซ. เชฎเซเชกเชฟเชฏเชพ เชธเซเชเซเชฐเซเชฎ API เชจเซ เชฐเชเซเชเชค เชชเชนเซเชฒเชพเช, เชคเซ เชตเซเชฌเชเซเชฎเชฅเซ เชตเชฟเชกเชฟเชฏเซ เช
เชจเซ เชตเซเชเชธ เชธเซเชเซเชฐเซเชฎ เชเชฐเชตเชพ เชคเซเชฎเช เชฌเซเชฐเชพเชเชเชฐเชฎเชพเช เชตเชฟเชตเชฟเชง เชชเซเชฐเชเชพเชฐเชจเซ เชเซเชจเซเชซเชฐเชจเซเชธ เช
เชจเซ เชเซเชเซเชธ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชตเซเชฏเชตเชนเชพเชฐเซเช เชฐเซเชคเซ เชเชเชฎเชพเชคเซเชฐ เชชเซเชฒเซเชเชซเซเชฐเซเชฎ เชนเชคเซเช. เชฎเซเชกเชฟเชฏเชพ เชฎเชพเชนเชฟเชคเซ เชเซเชฐเชพเชจเซเชธเชฎเชฟเช เชเชฐเชตเชพ เชฎเชพเชเซเชจเซ เชชเซเชฐเซเชเซเชเซเชฒ RTMP (เชฐเซเช
เชฒ เชเชพเชเชฎ เชฎเซเชธเซเชเชฟเชเช เชชเซเชฐเซเชเซเชเซเชฒ) เชตเชพเชธเซเชคเชตเชฎเชพเช เชฒเชพเชเชฌเชพ เชธเชฎเชฏเชฅเซ เชฌเชเชง เชนเชคเซ, เชเซเชจเซ เช
เชฐเซเชฅ เชนเชคเซ: เชเซ เชคเชฎเซ เชคเชฎเชพเชฐเซ เชธเซเชเซเชฐเซเชฎเชฟเชเช เชธเซเชตเชพเชจเซ เชฌเซเชธเซเช เชเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชนเซ, เชคเซ Adobe-Adobe Media Server (AMS) เชจเชพ เชธเซเชซเซเชเชตเซเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชชเซเชฐเชคเชพ เชฆเชฏเชพเชณเซ เชฌเชจเซ.
2012 เชฎเชพเช เชฅเซเชกเชพ เชธเชฎเชฏ เชชเชเซ, Adobe เชเชพเชนเซเชฐ เชเชจเชคเชพ เชฎเชพเชเซ "เชคเซเชฏเชพเช เชเชฐเซเชฏเซ เช
เชจเซ เชคเซเชจเซ เชฌเชนเชพเชฐ เชเชพเชขเซเชฏเซ".
Adobe Flash เชชเซเชฒเซเชเชซเซเชฐเซเชฎ 20 เชตเชฐเซเชทเชฅเซ เชตเชงเซ เชเซเชจเซเช เชเซ, เชคเซ เชธเชฎเชฏ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชเชฃเซ เชจเชฟเชฐเซเชฃเชพเชฏเช เชจเชฌเชณเชพเชเช เชฎเชณเซ เชเชตเซ เชเซ, เชธเชชเซเชฐเซเช
เชฎเชพเชฐเชพ เชชเซเชฐเซเชเซเชเซเช เชฎเชพเชเซ, เชฎเซเช เชคเชฐเชค เช เชฌเซเชฐเชพเชเชเชฐเชฎเชพเช เชซเซเชฒเซเชถเชจเซ เชเชชเชฏเซเช เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชเซเชกเซ เชฆเซเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช. เชฎเซเช เชเชชเชฐเชจเซเช เชฎเซเชเซเชฏ เชเชพเชฐเชฃ เชธเซเชเชตเซเชฏเซเช เชเซ; เชซเซเชฒเซเชถ เชชเชฃ เชฎเซเชฌเชพเชเชฒ เชชเซเชฒเซเชเชซเซเชฐเซเชฎ เชชเชฐ เชฌเชฟเชฒเชเซเชฒ เชธเชชเซเชฐเซเชเซเชก เชจเชฅเซ, เช เชจเซ เชนเซเช เชเชฐเซเชเชฐ 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)
}
เชเซเชฒเชพเชฏเชเช (เชธเซเชเซเชฐเซเชฎเชฟเชเช เชฌเชพเชเซ) เชชเชฐ, เชคเชฎเชพเชฐเซ เชชเชนเซเชฒเชพ เชเซ
เชฎเซเชฐเชพเชจเซ เชเชเซเชธเซเชธ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชฆเซเชตเชพเชฐเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ
เช
เชฎเซ เชเซเชฎเซเชฐเชพ/เชฎเชพเชเชเซเชฐเซเชซเซเชจ เชฆเซเชตเชพเชฐเชพ เชเชเซเชธเซเชธ (เชชเชฐเชตเชพเชจเชเซ) เชฎเซเชณเชตเซเช เชเซเช
เชเชเชณ, 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>
เชธเซเชเซเชเซเชธ เชชเชฐ เชตเชฟเชกเชฟเช เชธเซเชเซเชฐเซเชฎเชจเซเช เชชเซเชฐเชธเชพเชฐเชฃ เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชคเซเชจเซ เชเซเชฏเชพเชเช เชเชจเซเชเซเชก เชเชฐเชตเชพเชจเซ, เชคเซเชจเซ เชฌเชซเชฐ เชเชฐเชตเชพเชจเซ เช
เชจเซ เชญเชพเชเซเชฎเชพเช เชคเซเชจเซ เชเซเชฐเชพเชจเซเชธเชฎเชฟเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชเชพเชเซ เชตเชฟเชกเชฟเช เชธเซเชเซเชฐเซเชฎ เชตเซเชฌเชธเซเชเซเชเซเชธ เชฆเซเชตเชพเชฐเชพ เชเซเชฐเชพเชจเซเชธเชฎเชฟเช เชเชฐเซ เชถเชเชพเชคเซ เชจเชฅเซ. เช เชคเซ เชเซ เชเซเชฏเชพเช เชคเซ เช
เชฎเชพเชฐเซ เชธเชนเชพเชฏ เชฎเชพเชเซ เชเชตเซ เชเซ
เช เชฎเซ เชตเชฟเชกเชฟเช เชธเซเชเซเชฐเซเชฎเชจเซ เชเชจเซเชเซเชก เชเชฐเซเช เชเซเช, เชคเซเชจเซ เชเซเชเชกเชพเชเชฎเชพเช เชคเซเชกเซเช เชเซเช
<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>
เชฒเชพเชเชฌเชพ เชธเชฎเชฏ เชธเซเชงเซ เชฎเซเช เช เชธเชฎเชเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเชฏเซ เชเซ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซเชฒเชพ เชเซเชเชกเชพเชเชจเซ เชชเซเชฒเซเชฌเซเช เชฎเชพเชเซ เชตเชฟเชกเชฟเชฏเซ เชเชฒเชฟเชฎเซเชจเซเช เชชเชฐ เชคเชฐเชค เช เชฎเซเชเชฒเชตเชพเชจเซเช เชเซเชฎ เช
เชถเชเซเชฏ เชเซ, เชชเชฐเชเชคเซ เชคเซ เชฌเชนเชพเชฐ เชเชตเซเชฏเซเช เชเซ เช เชเชฐเซ เชถเชเชพเชคเซเช เชจเชฅเซ, เช
เชฒเชฌเชคเซเชค, เชคเชฎเชพเชฐเซ เชชเชนเซเชฒเชพ เชญเชพเชเชจเซ เชฌเชเชงเชพเชฏเซเชฒเชพ เชตเชฟเชถเชฟเชทเซเช เชฌเชซเชฐเชฎเชพเช เชฎเซเชเชตเซ เชเชตเชถเซเชฏเช เชเซ. เชตเชฟเชกเซเชฏเซ เชคเชคเซเชต, เช
เชจเซ เชคเซ เชชเชเซ เช เชคเซ เชตเชฟเชกเซเชฏเซ เชธเซเชเซเชฐเซเชฎ เชเชฒเชพเชตเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเชถเซ. เช เชฎเชพเชเซ เชคเชฎเชพเชฐเซ เชเชฐเซเชฐ เชชเชกเชถเซ
เชฎเซเชกเชฟเชฏเชพเชธเซเชฐเซเชธ เชฎเซเชกเชฟเชฏเชพ เชชเซเชฒเซเชฌเซเช เชเชฌเซเชเซเชเซเช เช เชจเซ เช เชฎเซเชกเชฟเชฏเชพ เชธเซเชเซเชฐเซเชฎเชจเชพ เชธเซเชคเซเชฐเซเชค เชตเชเซเชเซ เชเช เชชเซเชฐเชเชพเชฐเชจเชพ เชฎเชงเซเชฏเชธเซเชฅเซ เชคเชฐเซเชเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ. เชฎเซเชกเชฟเชฏเชพเชธเซเชฐเซเชธ เชเชฌเซเชเซเชเซเชเชฎเชพเช เชตเชฟเชกเชฟเช/เชเชกเชฟเช เชธเซเชเซเชฐเซเชฎเชจเชพ เชธเซเชคเซเชฐเซเชค เชฎเชพเชเซ เชชเซเชฒเช เชเชฐเซ เชถเชเชพเชฏ เชคเซเชตเซเช เชฌเชซเชฐ เชเซ. เชเช เชตเชฟเชถเซเชทเชคเชพ เช เชเซ เชเซ เชฌเชซเชฐ เชซเชเซเชค 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 เชชเชพเชเชณ เชฐเชนเซเชถเซ; เชธเชฐเซเชตเชฐ เชชเชฐ เชชเซเชฐเชธเชพเชฐเชฟเชค เชเชฐเชคเชพ เชชเชนเซเชฒเชพ เชตเชฟเชกเชฟเชฏเซ เชธเซเชเซเชฐเซเชฎเชจเซ เชตเชฟเชญเชพเชเชฟเชค เชเชฐเชคเซ เชตเชเชคเซ เช
เชฎเซ เช เชเชพเชคเซ เชธเซเช เชเชฐเซเช เชเซเช. เชคเชฆเซเชชเชฐเชพเชเชค, เชเซเชฏเชพเชฐเซ เชฎเซเช เชฎเชพเชฐเชพ เชฒเซเชชเชเซเชช เชชเชฐ เชคเชชเชพเชธ เชเชฐเซ, เชคเซเชฏเชพเชฐเซ เชเซเชฐเชพเชจเซเชธเชฎเชฟเชเชฟเชเช เช
เชจเซ เชฐเซเชธเซเชตเชฟเชเช เชฌเชพเชเซเช เชตเชเซเชเซเชจเซ เช
เชเชคเชฐ เชงเซเชฎเซ เชงเซเชฎเซ เชธเชเชเชฟเชค เชฅเชฏเซ, เช เชธเซเชชเชทเซเชเชชเชฃเซ เชฆเซเชเชพเชคเซเช เชนเชคเซเช. เชฎเซเช เช เชเซเชฐเชฒเชพเชญเชจเซ เชฆเซเชฐ เชเชฐเชตเชพเชจเชพ เชฐเชธเซเชคเชพเช เชถเซเชงเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซเชฏเซเช, เช
เชจเซ...
เชธเซเชฐเซเชธ: www.habr.com