--- name: livestream-engineer description: Expert in live streaming, WebRTC, and real-time video/audio version: 1.0.0 tags: [livestream, webrtc, real-time, streaming, broadcasting] --- # Livestream Engineer Skill I help you build live streaming features, implement WebRTC, and create real-time broadcasting experiences. ## What I Do **Live Streaming:** - WebRTC peer-to-peer video - Live broadcasting - Screen sharing - Real-time chat **Streaming Platforms:** - Twitch-style streaming - Video conferencing - Live events - Webinars ## WebRTC Basics ### Peer-to-Peer Video Call ```typescript // lib/webrtc.ts export class WebRTCConnection { private peerConnection: RTCPeerConnection private localStream: MediaStream | null = null constructor() { this.peerConnection = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] }) } async startLocalStream() { try { this.localStream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true }) this.localStream.getTracks().forEach(track => { this.peerConnection.addTrack(track, this.localStream!) }) return this.localStream } catch (error) { console.error('Failed to get local stream:', error) throw error } } async createOffer() { const offer = await this.peerConnection.createOffer() await this.peerConnection.setLocalDescription(offer) return offer } async handleAnswer(answer: RTCSessionDescriptionInit) { await this.peerConnection.setRemoteDescription(answer) } async handleOffer(offer: RTCSessionDescriptionInit) { await this.peerConnection.setRemoteDescription(offer) const answer = await this.peerConnection.createAnswer() await this.peerConnection.setLocalDescription(answer) return answer } addIceCandidate(candidate: RTCIceCandidateInit) { return this.peerConnection.addIceCandidate(candidate) } onTrack(callback: (stream: MediaStream) => void) { this.peerConnection.ontrack = event => { callback(event.streams[0]) } } onIceCandidate(callback: (candidate: RTCIceCandidate) => void) { this.peerConnection.onicecandidate = event => { if (event.candidate) { callback(event.candidate) } } } close() { this.localStream?.getTracks().forEach(track => track.stop()) this.peerConnection.close() } } ``` **Usage:** ```typescript 'use client' import { useEffect, useRef, useState } from 'react' import { WebRTCConnection } from '@/lib/webrtc' export function VideoCall() { const localVideoRef = useRef(null) const remoteVideoRef = useRef(null) const [connection] = useState(() => new WebRTCConnection()) useEffect(() => { const init = async () => { // Start local stream const stream = await connection.startLocalStream() if (localVideoRef.current) { localVideoRef.current.srcObject = stream } // Handle remote stream connection.onTrack((remoteStream) => { if (remoteVideoRef.current) { remoteVideoRef.current.srcObject = remoteStream } }) // Handle ICE candidates connection.onIceCandidate((candidate) => { // Send candidate to other peer via signaling server socket.emit('ice-candidate', candidate) }) } init() return () => { connection.close() } }, [connection]) return (

You

Remote

) } ``` --- ## Screen Sharing ```typescript 'use client' import { useRef, useState } from 'react' export function ScreenShare() { const videoRef = useRef(null) const [sharing, setSharing] = useState(false) const [stream, setStream] = useState(null) const startSharing = async () => { try { const mediaStream = await navigator.mediaDevices.getDisplayMedia({ video: { cursor: 'always' }, audio: false }) setStream(mediaStream) if (videoRef.current) { videoRef.current.srcObject = mediaStream } setSharing(true) // Handle when user stops sharing via browser UI mediaStream.getVideoTracks()[0].onended = () => { stopSharing() } } catch (error) { console.error('Failed to start screen sharing:', error) } } const stopSharing = () => { stream?.getTracks().forEach(track => track.stop()) setStream(null) setSharing(false) } return (
) } ``` --- ## Live Streaming with Chat ```typescript // components/LiveStream.tsx 'use client' import { useState, useEffect, useRef } from 'react' import { io, Socket } from 'socket.io-client' interface ChatMessage { user: string message: string timestamp: Date } export function LiveStream({ streamId }: { streamId: string }) { const videoRef = useRef(null) const [socket, setSocket] = useState(null) const [messages, setMessages] = useState([]) const [messageInput, setMessageInput] = useState('') const [viewers, setViewers] = useState(0) useEffect(() => { // Connect to streaming server const newSocket = io('wss://streaming-server.com') setSocket(newSocket) // Join stream room newSocket.emit('join-stream', streamId) // Receive viewer count newSocket.on('viewer-count', (count: number) => { setViewers(count) }) // Receive chat messages newSocket.on('chat-message', (msg: ChatMessage) => { setMessages(prev => [...prev, msg]) }) // Receive video stream chunks (simplified) newSocket.on('stream-data', (data: ArrayBuffer) => { // Handle stream data }) return () => { newSocket.disconnect() } }, [streamId]) const sendMessage = () => { if (!socket || !messageInput.trim()) return socket.emit('chat-message', { user: 'Anonymous', message: messageInput, timestamp: new Date() }) setMessageInput('') } return (
{/* Video Player */}
{/* Chat */}
Live Chat
{messages.map((msg, i) => (
{msg.user}: {msg.message}
))}
setMessageInput(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && sendMessage()} placeholder="Say something..." className="w-full px-4 py-2 border rounded" />
) } ``` --- ## Broadcasting Dashboard ```typescript // components/BroadcastDashboard.tsx 'use client' import { useState, useRef } from 'react' export function BroadcastDashboard() { const videoRef = useRef(null) const [broadcasting, setBroadcasting] = useState(false) const [stream, setStream] = useState(null) const [viewers, setViewers] = useState(0) const startBroadcast = async () => { try { const mediaStream = await navigator.mediaDevices.getUserMedia({ video: { width: { ideal: 1920 }, height: { ideal: 1080 } }, audio: { echoCancellation: true, noiseSuppression: true } }) setStream(mediaStream) if (videoRef.current) { videoRef.current.srcObject = mediaStream } // Start broadcasting to server // (Implementation depends on streaming protocol) setBroadcasting(true) } catch (error) { console.error('Failed to start broadcast:', error) } } const stopBroadcast = () => { stream?.getTracks().forEach(track => track.stop()) setStream(null) setBroadcasting(false) } return (

Broadcast Dashboard

{broadcasting && (

🔴 LIVE - {viewers} viewers

)}
{broadcasting && ( )}
) } ``` --- ## Multi-Party Video Conference ```typescript // components/VideoConference.tsx 'use client' import { useEffect, useState, useRef } from 'react' interface Participant { id: string name: string stream: MediaStream } export function VideoConference() { const [participants, setParticipants] = useState([]) const localVideoRef = useRef(null) useEffect(() => { // Initialize local stream navigator.mediaDevices.getUserMedia({ video: true, audio: true }) .then(stream => { if (localVideoRef.current) { localVideoRef.current.srcObject = stream } }) }, []) return (
{/* Local video */}
{/* Remote participants */} {participants.map((participant) => (
))}
) } ``` --- ## When to Use Me **Perfect for:** - Building video call features - Creating livestream platforms - Implementing screen sharing - Building webinar tools - Creating video conferencing apps **I'll help you:** - Implement WebRTC - Build broadcast features - Add screen sharing - Create video conferencing - Handle real-time chat ## What I'll Create ``` đŸŽĨ Live Streaming 📹 Video Calls đŸ–Ĩī¸ Screen Sharing đŸ’Ŧ Real-Time Chat đŸ‘Ĩ Multi-Party Conferences 🔴 Broadcasting Tools ``` Let's build amazing live experiences!