Hello! ?
Dalam tutorial ini saya akan menunjukkan kepada anda cara menggunakan API WebCodec untuk menghantar dan menerima video.
Mula-mula mari dapatkan pengekodan pelayan.
Untuk menghantar dan menerima paket antara rakan sebaya, kami memerlukan pelayan soket web.
Untuk ini kami akan mencipta pelayan yang sangat asas menggunakan nodejs. Mula-mula mulakan projek:
npm init -y
Kemudian pasang modul yang diperlukan:
npm i ws express
Seterusnya buat fail baharu yang dipanggil "index.js" dan isikannya dengan kod berikut:
// server.js const WebSocket = require('ws'); const express = require('express'); const app = express(); const port = 3000; const connectedClients = new Set(); app.use(express.static(__dirname + '/public')); const wss = new WebSocket.Server({ noServer: true }); wss.on('connection', ws => { console.log('new connection'); connectedClients.add(ws); ws.on('message', message => { connectedClients.forEach(client => { if (client !== ws && client.readyState === WebSocket.OPEN) { client.send(message); } }); }); ws.once('close', () => { connectedClients.delete(ws); console.log('connection closed'); }); }); const server = app.listen(port, () => { console.log(`server running on port ${port}`); }); server.on('upgrade', (request, socket, head) => { wss.handleUpgrade(request, socket, head, (ws) => { wss.emit('connection', ws, request); }); });
Tiada yang terlalu rumit kod di atas menyediakan direktori awam dan mengendalikan sambungan soket web yang menghantar paket kepada semua rakan sebaya yang disambungkan. ?
Seterusnya kami akan mengendalikan bahagian penghantar, tetapi mula-mula buat direktori baharu yang dipanggil "awam"
mkdir public
Fail hujung hadapan pertama yang kami akan buat ialah yang sedang menyiarkan, buat fail baharu yang dipanggil "sender.html" di bawah awam dan isikannya dengan HTML berikut:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>Sender</title> <style> video, canvas { width: 640px; height: 480px; border: 2px solid black; margin: 10px; } </style> </head> <body> <video id="video" autoplay playsinline></video> <canvas id="canvas" width="640" height="480"></canvas> <script> const videoElement = document.getElementById('video'); const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); let videoEncoder; let socket; const initWebSocket = () => { socket = new WebSocket('ws://localhost:3000'); socket.onopen = () => console.log('WebSocket connected'); socket.onerror = error => console.error('WebSocket error:', error); }; const initEncoder = () => { videoEncoder = new VideoEncoder({ output: (encodedChunk) => { const chunkData = new Uint8Array(encodedChunk.byteLength); encodedChunk.copyTo(chunkData); if (socket.readyState === WebSocket.OPEN) { socket.send(chunkData.buffer); } }, error: (error) => console.error('Encoding error:', error) }); videoEncoder.configure({ codec: 'vp8', width: 640, height: 480, bitrate: 1_000_000, framerate: 30 }); }; navigator.mediaDevices.getUserMedia({ video: true }) .then((stream) => { videoElement.srcObject = stream; const videoTrack = stream.getVideoTracks()[0]; const processor = new MediaStreamTrackProcessor(videoTrack); const reader = processor.readable.getReader(); const processFrames = async () => { while (true) { const { value: videoFrame, done } = await reader.read(); if (done) break; ctx.drawImage(videoFrame, 0, 0, canvas.width, canvas.height); videoEncoder.encode(videoFrame, { keyFrame: true }); videoFrame.close(); } }; processFrames(); }) .catch((error) => console.error('Failed to get camera', error)); initEncoder(); initWebSocket(); </script> </body> </html>
Untuk memecahkan dan menerangkan perkara yang dilakukan oleh kod.
Fuh! Mudah-mudahan itu dapat difahami oleh anda. Seterusnya kami akan mencipta fail yang akan menerima aliran. ?
Fail ini menerima ketulan video yang dikodkan melalui WebSocket, menyahkodnya dan memaparkannya pada elemen kanvas.
Buat fail baharu di bawah direktori awam yang dipanggil "receiver.html" dan isikannya dengan yang berikut:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>Receiver</title> <style> canvas { width: 640px; height: 480px; border: 2px solid black; margin: 10px; } </style> </head> <body> <canvas id="canvas" width="640" height="480"></canvas> <script> const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); let videoDecoder; const initWebSocket = () => { const socket = new WebSocket('ws://localhost:3000'); socket.binaryType = 'arraybuffer'; socket.onmessage = event => { decodeFrame(event.data); }; socket.onerror = error => console.error('WebSocket error:', error); }; const initDecoder = () => { videoDecoder = new VideoDecoder({ output: (videoFrame) => { ctx.drawImage(videoFrame, 0, 0, canvas.width, canvas.height); videoFrame.close(); }, error: (error) => console.error('Decoding error:', error) }); videoDecoder.configure({ codec: 'vp8', width: 640, height: 480 }); }; const decodeFrame = (encodedData) => { const chunk = new EncodedVideoChunk({ type: 'key', timestamp: performance.now(), data: new Uint8Array(encodedData) }); videoDecoder.decode(chunk); }; initDecoder(); initWebSocket(); </script> </body> </html>
Untuk memecahkan fail di atas:
Fuh! Sekarang setelah kita mempunyai semua bahagian yang diperlukan, mari kita jalankan! ?
Untuk menjalankan kod hanya jalankan arahan berikut:
node index.js
Kemudian arahkan penyemak imbas anda ke http://localhost:3000/sender.html
Benarkan akses kepada kamera anda dan kemudian buka tab lain untuk
http://localhost:3000/receiver.html
Seperti di bawah, anda sepatutnya melihat strim dihantar daripada pengirim.
Dalam tutorial ini saya telah menunjukkan cara untuk mendapatkan akses kepada kamera, mengekodnya, menghantar ketulan melalui WebSocket dan menyahkod serta memaparkannya pada bahagian penerima. Saya harap tutorial ini berguna kepada anda. ?
Seperti biasa anda boleh mendapatkan kod melalui github saya:
https://github.com/ethand91/webcodec-stream
Selamat Pengekodan! ?
Suka kerja saya? Saya menyiarkan tentang pelbagai topik, jika anda ingin melihat lebih banyak sila like dan ikuti saya.
Saya juga suka kopi.
Jika anda ingin mempelajari Corak Algoritma untuk mengikuti temu duga pengekodan, saya mengesyorkan [kursus berikut](https://algolab.so/p/algorithms-and-data-structure-video-course?affcode=1413380_bzrepgch
Atas ialah kandungan terperinci WebCodec - Menghantar dan Menerima. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!