@flow-player/browser-runtimeESM browser runtime for H.264 / H.265 FLV live and VOD playback with WebCodecs, WebGL2, and a Rust-powered WASM demux core. Zero npm dependencies.
Quick Start (Live)import { flowLivePlayer } from "@flow-player/browser-runtime" ;
const player = new flowLivePlayer ( {
canvas: document. getElementById ( "player-canvas" ) as HTMLCanvasElement,
wasmUrl: "/wasm/flow_player_wasm.wasm" ,
workerFactory : ( ) => new PlayerWorker ( ) ,
useWCS: true ,
} ) ;
player. on ( "play" , ( ) => console . log ( "playing" ) ) ;
player. on ( "stats" , ( stats) => console . log ( stats. fps, "fps" ) ) ;
player. on ( "diagnostic" , ( detail) => console . warn ( "normalization:" , detail) ) ;
await player. play ( "https://example.com/live.flv" ) ; Quick Start (VOD)import { flowVodPlayer } from "@flow-player/browser-runtime" ;
const player = flowVodPlayer ( {
canvas: document. getElementById ( "vod-canvas" ) as HTMLCanvasElement,
wasmUrl: "/wasm/flow_player_wasm.wasm" ,
workerFactory : ( ) => new Worker (
new URL ( "@flow-player/browser-runtime/worker" , import . meta. url) ,
{ type: "module" }
) ,
} ) ;
player. playList ( [
{ url: "/vod/1.mp4" , startTimestamp: 0 , endTimestamp: 60000 , timeLen: 60 , fileSize: 1024000 , channelID: 1 , RecordType: 0 } ,
] ) ; Worker SetupThe module worker is at @flow-player/browser-runtime/worker.
Bundler
Import
Vite
import PlayerWorker from "@flow-player/browser-runtime/worker?worker"
webpack 5
new Worker(new URL("@flow-player/browser-runtime/worker", import.meta.url))
esbuild
new Worker(new URL("@flow-player/browser-runtime/worker", import.meta.url), { type: "module" })
WASM DeploymentThe .wasm artifact (~147 KB release) is included at wasm/flow_player_wasm.wasm in the npm package. Deploy it to a static path:
new flowLivePlayer ( {
wasmUrl: "https://cdn.example.com/flow_player_wasm.wasm" ,
} ) ; API ReferenceflowLivePlayer
Method
Description
play(url)
Start streaming
pause()
Pause
close() / destroy()
Stop and release resources
screenshot(filename?, format?, quality?, type?)
Capture frame → string | Blob | void
startRecord(name?, type?) / stopRecordAndSave() / isRecording()
Recording
mute() / cancelMute() / setVolume(v) / isMute()
Audio control
setScaleMode(m) / setRotate(deg) / resize(w, h) / clearView()
Display
setFullscreen(f) / toggleControlBar(b) / getControlBarShow()
Fullscreen
setKeepScreenOn()
Prevent screen sleep
Property
Type
metrics
RuntimeMetrics (chunksPushed, firstFrameAt, ...)
loaded, playing, muted, volume
State booleans/numbers
scaleMode, fullscreen, rotate
Display state
Key Events
Payload
play, pause, destroy
void
start
void (first frame rendered)
stats
FlowLivePlayerStats {buf, fps, abps, vbps, ts}
videoInfo
FlowLivePlayerVideoInfo {width, height, codec, codecString}
error
unknown
diagnostic
unknown (stream normalization detail)
timeout
FlowLivePlayerTimeoutDetail
resize
FlowLivePlayerResizeDetail
clearView
FlowLivePlayerClearViewDetail
mute / fullscreen
boolean
volume
number
scaleMode
FlowLivePlayerScaleMode
rotate
number
recordStart / recordEnd / recordError
unknown
recordingTimestamp
number (seconds)
flowVodPlayer
Method
Description
playList(segments: FlowVodRecordSegment[])
Load and start VOD playback
seek(timestampMs)
Seek to absolute millisecond timestamp
pause() / resume()
Playback control
nextSegment() / previousSegment()
Segment navigation
nextFrame() / previousFrame()
Frame-stepping
setRate(rate)
Playback speed (e.g. 2 = 2×)
setGapPolicy(policy: FlowVodGapPolicy)
Gap handling ("jump" or "hold")
destroy()
Stop and release resources
Property
Type
state
"idle" | "loading" | "playing" | "paused" | ...
rate
number
snapshot
FlowVodPlayerSnapshot
videoElement
HTMLVideoElement | null (MSE mode only)
FlowVodRecordSegmentinterface FlowVodRecordSegment {
url: string ;
startTimestamp: number ;
endTimestamp: number ;
timeLen: number ;
fileSize: number ;
channelID: number | string ;
RecordType: number | string ;
} Tree ShakingPackage is "sideEffects": false with per-module output. Modern bundlers (Vite, webpack 5, Rollup, esbuild) will remove unused code automatically. Importing only flowLivePlayer excludes VOD from your bundle.
LicenseMIT
Development
npm run build:wasm
npm run build:package
npm run publish:check
npm run test:smoke
npm run typecheck