เจเจธ เจฒเฉเจ เจตเจฟเฉฑเจ เจฎเฉเจ เจคเฉเจเฉ-เจงเจฟเจฐ เจฆเฉ เจฌเฉเจฐเจพเจเจเจผเจฐ เจชเจฒเฉฑเจเจเจจ เจเจฟเจตเฉเจ เจเจฟ เจ
เจกเฉเจฌ เจซเจฒเฉเจธเจผ เจชเจฒเฉเจ
เจฐ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ เจฌเจฟเจจเจพเจ เจตเฉเจฌเจธเจพเจเฉเจ เจฐเจพเจนเฉเจ เจตเฉเจกเฉเจ เจธเจเฉเจฐเฉเจฎ เจเจฐเจจ เจฆเฉเจเจ เจเจชเจฃเฉเจเจ เจเฉเจธเจผเจฟเจธเจผเจพเจ เจจเฉเฉฐ เจธเจพเจเจเจพ เจเจฐเจจเจพ เจเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจเฅค เจเจน เจชเจคเจพ เจเจฐเจจ เจฒเจ เจชเฉเฉเจนเฉ เจเจฟ เจเจธเจฆเจพ เจเฉ เจจเจฟเจเจฒเจฟเจเฅค
เจ
เจกเฉเจฌ เจซเจฒเฉเจธเจผ, เจชเจนเจฟเจฒเจพเจ เจฎเฉเจเจฐเฉเจฎเฉเจกเฉเจ เจซเจฒเฉเจธเจผ, เจเฉฑเจ เจตเฉเฉฑเจฌ เจฌเฉเจฐเจพเจเจเจผเจฐ เจตเจฟเฉฑเจ เจเฉฑเจฒเจฃ เจตเจพเจฒเฉเจเจ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจฌเจฃเจพเจเจฃ เจฒเจ เจเฉฑเจ เจชเจฒเฉเจเจซเจพเจฐเจฎ เจนเฉเฅค เจฎเฉเจกเฉเจ เจธเจเฉเจฐเฉเจฎ API เจฆเฉ เจเจพเจฃ-เจชเจเจพเจฃ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ, เจเจน เจเฉฑเจ เจตเฉเจฌเจเฉเจฎ เจคเฉเจ เจตเฉเจกเฉเจ เจ
เจคเฉ เจตเฉเจเจธ เจธเจเฉเจฐเฉเจฎ เจเจฐเจจ เจฆเฉ เจจเจพเจฒ-เจจเจพเจฒ เจฌเฉเจฐเจพเจเจเจผเจฐ เจตเจฟเฉฑเจ เจเจ เจคเจฐเฉเจนเจพเจ เจฆเฉเจเจ เจเจพเจจเจซเจฐเฉฐเจธเจพเจ เจ
เจคเฉ เจเฉเจเจพเจ เจฌเจฃเจพเจเจฃ เจฒเจ เจ
เจฎเจฒเฉ เจคเฉเจฐ 'เจคเฉ เจเฉฑเจเฉ เจเฉฑเจ เจชเจฒเฉเจเจซเจพเจฐเจฎ เจธเฉเฅค เจฎเฉเจกเฉเจ เจเจพเจฃเจเจพเจฐเฉ เจชเฉเจฐเจธเจพเจฐเจฟเจค เจเจฐเจจ เจฒเจ เจชเฉเจฐเฉเจเฉเจเฉเจฒ RTMP (เจฐเฉเจ
เจฒ เจเจพเจเจฎ เจฎเฉเจธเฉเจเจฟเฉฐเจ เจชเฉเจฐเฉเจเฉเจเฉเจฒ) เจ
เจธเจฒ เจตเจฟเฉฑเจ เจฒเฉฐเจฌเฉ เจธเจฎเฉเจ เจฒเจ เจฌเฉฐเจฆ เจธเฉ, เจเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจธเฉ: เจเฉเจเจฐ เจคเฉเจธเฉเจ เจเจชเจฃเฉ เจธเจเฉเจฐเฉเจฎเจฟเฉฐเจ เจธเฉเจตเจพ เจจเฉเฉฐ เจนเฉเจฒเจพเจฐเจพ เจฆเฉเจฃเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเฉ, เจคเจพเจ เจ
เจกเฉเจฌ เจคเฉเจ เจธเจพเจซเจเจตเฉเจ
เจฐ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฒเจ เจเจพเจซเจผเฉ เจฆเจฟเจเจฒเฉ เจฌเจฃเฉ - Adobe Media Server (AMS)เฅค
2012 เจตเจฟเฉฑเจ เจเฉเจ เจธเจฎเฉเจ เจฌเจพเจ
เจฆ, Adobe เจจเฉ เจฒเฉเจเจพเจ เจจเฉเฉฐ "เจเฉฑเจก เจฆเจฟเฉฑเจคเจพ เจ
เจคเฉ เจเจธเจจเฉเฉฐ เจฌเจพเจนเจฐ เจเฉฑเจข เจฆเจฟเฉฑเจคเจพ"เฅค
เจ
เจกเฉเจฌ เจซเจฒเฉเจธเจผ เจชเจฒเฉเจเจซเจพเจฐเจฎ 20 เจธเจพเจฒ เจคเฉเจ เจตเฉฑเจง เจชเฉเจฐเจพเจฃเจพ เจนเฉ, เจเจฟเจธ เจฆเฉเจฐเจพเจจ เจเจ เจเฉฐเจญเฉเจฐ เจเจฎเจเจผเฉเจฐเฉเจเจ เจเฉเจเฉเจเจ เจเจเจเจ เจนเจจ, เจธเจฎเจฐเจฅเจจ
เจฎเฉเจฐเฉ เจชเฉเจฐเฉเจเฉเจเจ เจฒเจ, เจฎเฉเจ เจคเฉเจฐเฉฐเจค เจฌเฉเจฐเจพเจเจเจผเจฐ เจตเจฟเฉฑเจ เจซเจฒเฉเจธเจผ เจฆเฉ เจตเจฐเจคเฉเจ เจจเฉเฉฐ เจชเฉเจฐเฉ เจคเจฐเฉเจนเจพเจ เจเฉฑเจกเจฃ เจฆเจพ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ. เจฎเฉเจ เจเจชเจฐเฉเจเจค เจฎเฉเฉฑเจ เจเจพเจฐเจจ เจฆเจพ เจธเฉฐเจเฉเจค เจฆเจฟเฉฑเจคเจพ เจนเฉ; เจซเจฒเฉเจธเจผ เจตเฉ เจฎเฉเจฌเจพเจเจฒ เจชเจฒเฉเจเจซเจพเจฐเจฎเจพเจ 'เจคเฉ เจฌเจฟเจฒเจเฉเจฒ เจตเฉ เจธเจฎเจฐเจฅเจฟเจค เจจเจนเฉเจ เจนเฉ, เจ เจคเฉ เจฎเฉเจ เจ เจธเจฒ เจตเจฟเฉฑเจ เจตเจฟเฉฐเจกเฉเจเจผ (เจตเจพเจเจจ เจเจฎเฉเจฒเฉเจเจฐ) 'เจคเฉ เจตเจฟเจเจพเจธ เจฒเจ เจ เจกเฉเจฌ เจซเจฒเฉเจธเจผ เจจเฉเฉฐ เจคเฉเจจเจพเจค เจจเจนเฉเจ เจเจฐเจจเจพ เจเจพเจนเฉเฉฐเจฆเจพ เจธเฉเฅค เจเจธ เจฒเจ เจฎเฉเจ 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>
เจฒเฉฐเจฌเฉ เจธเจฎเฉเจ เจฒเจ เจฎเฉเจ เจเจน เจธเจฎเจเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเฉเจคเฉ เจเจฟ เจชเฉเจฐเจพเจชเจค เจเฉเจคเฉ เจเฉเจเฉเจฟเจเจ เจจเฉเฉฐ เจคเฉเจฐเฉฐเจค เจชเจฒเฉเจฌเฉเจ เจฒเจ เจตเฉเจกเฉเจ เจคเฉฑเจค เจจเฉเฉฐ เจญเฉเจเจฃเจพ เจ
เจธเฉฐเจญเจต เจเจฟเจเจ เจนเฉ, เจชเจฐ เจเจน เจชเจคเจพ เจเจฒเจฟเจ เจเจฟ เจเจน เจจเจนเฉเจ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ, เจฌเฉเจธเจผเจ, เจคเฉเจนเจพเจจเฉเฉฐ เจชเจนเจฟเจฒเจพเจ เจเฉเจเฉเฉ เจจเฉเฉฐ เจเฉฑเจ เจตเจฟเจธเจผเฉเจธเจผ เจฌเจซเจฐ เจตเจฟเฉฑเจ เจฌเฉฐเจจเฉเจนเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ. เจตเฉเจกเฉเจ เจคเฉฑเจค, เจ
เจคเฉ เจเฉเจตเจฒ เจคเจฆ เจนเฉ เจเจน เจตเฉเจกเฉเจ เจธเจเฉเจฐเฉเจฎ เจจเฉเฉฐ เจเจฒเจพเจเจฃเจพ เจธเจผเฉเจฐเฉ เจเจฐเฉเจเจพเฅค เจเจธ เจฆเฉ เจฒเจ เจคเฉเจนเจพเจจเฉเฉฐ เจฒเฉเฉ เจนเฉเจตเฉเจเฉ
MediaSource เจฎเฉเจกเฉเจ เจชเจฒเฉเจฌเฉเจ เจเจฌเจเฉเจเจ เจ เจคเฉ เจเจธ เจฎเฉเจกเฉเจ เจธเจเฉเจฐเฉเจฎ เจฆเฉ เจธเจฐเฉเจค เจฆเฉ เจตเจฟเจเจเจพเจฐ เจเฉฑเจ เจเจฟเจธเจฎ เจฆเฉ เจตเจฟเจเฉเจฒเฉ เจตเจเฉเจ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉเฅค MediaSource เจเจฌเจเฉเจเจ เจตเจฟเฉฑเจ เจตเฉเจกเฉเจ/เจเจกเฉเจ เจธเจเฉเจฐเฉเจฎ เจฆเฉ เจธเจฐเฉเจค เจฒเจ เจเฉฑเจ เจชเจฒเฉฑเจ เจเจฐเจจ เจฏเฉเจ เจฌเจซเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉเฅค เจเฉฑเจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพ เจเจน เจนเฉ เจเจฟ เจฌเจซเจฐ เจธเจฟเจฐเจซ Uint8 เจกเจพเจเจพ เจฐเฉฑเจ เจธเจเจฆเจพ เจนเฉ, เจเจธเจฒเจ เจคเฉเจนเจพเจจเฉเฉฐ เจ เจเจฟเจนเจพ เจฌเจซเจฐ เจฌเจฃเจพเจเจฃ เจฒเจ เจเฉฑเจ FileReader เจฆเฉ เจฒเฉเฉ เจชเจตเฉเจเฉเฅค เจเฉเจก เจจเฉเฉฐ เจฆเฉเจเฉ เจ เจคเฉ เจเจน เจนเฉเจฐ เจธเจชเฉฑเจธเจผเจ เจนเฉ เจเจพเจตเฉเจเจพ:
เจตเฉเจกเฉเจ เจธเจเฉเจฐเฉเจฎ เจเจฒเจพเจเจ เจเจพ เจฐเจฟเจนเจพ เจนเฉ
<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