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