or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

configuration.mdcore-media-element.mdfeature-system.mdindex.mdmedia-player.mdrenderer-system.mdutility-functions.md

core-media-element.mddocs/

0

# Core Media Element

1

2

The MediaElement class is the foundation of MediaElement.js, providing a low-level wrapper that mimics the HTML5 MediaElement API while supporting multiple renderers and media formats.

3

4

## Capabilities

5

6

### MediaElement Constructor

7

8

Creates a new MediaElement instance that wraps an existing HTML media element or creates a new one.

9

10

```javascript { .api }

11

/**

12

* Create a new MediaElement instance

13

* @param idOrNode - Element ID string or DOM node to wrap

14

* @param options - Configuration options for the media element

15

* @param sources - Optional array of media source objects

16

*/

17

constructor(idOrNode: string | HTMLElement, options?: MediaElementOptions, sources?: MediaSource[]);

18

19

interface MediaElementOptions {

20

/** List of preferred renderers in priority order */

21

renderers?: string[];

22

/** HTML element type for the container */

23

fakeNodeName?: string;

24

/** Path to the icon sprite file */

25

iconSprite?: string;

26

}

27

28

interface MediaSource {

29

src: string;

30

type?: string;

31

}

32

```

33

34

**Usage Examples:**

35

36

```javascript

37

import { MediaElement } from 'mediaelement';

38

39

// Wrap existing video element

40

const mediaElement = new MediaElement('my-video');

41

42

// Create with options

43

const mediaElement = new MediaElement('my-audio', {

44

renderers: ['html5', 'hls'],

45

iconSprite: 'assets/icons.svg'

46

});

47

48

// Create with sources

49

const mediaElement = new MediaElement('player', {}, [

50

{ src: 'video.mp4', type: 'video/mp4' },

51

{ src: 'video.webm', type: 'video/webm' }

52

]);

53

```

54

55

### HTML5 MediaElement Properties

56

57

All standard HTML5 MediaElement properties are supported with cross-renderer compatibility.

58

59

```javascript { .api }

60

/** Current media source URL */

61

src: string;

62

63

/** Current playback position in seconds */

64

currentTime: number;

65

66

/** Total duration of media in seconds (read-only) */

67

readonly duration: number;

68

69

/** Volume level between 0.0 and 1.0 */

70

volume: number;

71

72

/** Whether audio is muted */

73

muted: boolean;

74

75

/** Whether media is currently paused (read-only) */

76

readonly paused: boolean;

77

78

/** Whether media has finished playing (read-only) */

79

readonly ended: boolean;

80

81

/** Current ready state of the media (read-only) */

82

readonly readyState: number;

83

84

/** Current network state (read-only) */

85

readonly networkState: number;

86

87

/** Whether media is currently seeking (read-only) */

88

readonly seeking: boolean;

89

90

/** TimeRanges object representing buffered portions (read-only) */

91

readonly buffered: TimeRanges;

92

93

/** TimeRanges object representing seekable portions (read-only) */

94

readonly seekable: TimeRanges;

95

96

/** Current playback rate (1.0 = normal speed) */

97

playbackRate: number;

98

99

/** Default playback rate */

100

defaultPlaybackRate: number;

101

102

/** Whether to automatically start playback */

103

autoplay: boolean;

104

105

/** Whether to loop playback */

106

loop: boolean;

107

108

/** Preload behavior ('none', 'metadata', 'auto') */

109

preload: string;

110

111

/** Whether to show default controls */

112

controls: boolean;

113

```

114

115

### HTML5 MediaElement Methods

116

117

Standard HTML5 MediaElement methods with renderer abstraction.

118

119

```javascript { .api }

120

/**

121

* Begin playback of the media

122

* @returns Promise that resolves when playback starts (modern browsers) or void

123

*/

124

play(): Promise<void> | void;

125

126

/**

127

* Pause media playback

128

*/

129

pause(): void;

130

131

/**

132

* Load the media resource

133

*/

134

load(): void;

135

136

/**

137

* Check if the media element can play a given MIME type

138

* @param type - MIME type string to check

139

* @returns Support level: '' (no), 'maybe', or 'probably'

140

*/

141

canPlayType(type: string): '' | 'maybe' | 'probably';

142

```

143

144

### MediaElement-Specific Methods

145

146

Additional methods specific to MediaElement.js functionality.

147

148

```javascript { .api }

149

/**

150

* Switch to a different renderer

151

* @param rendererName - Name of the renderer to switch to

152

* @param mediaFiles - Array of media source objects

153

* @returns Whether the renderer switch was successful

154

*/

155

changeRenderer(rendererName: string, mediaFiles: MediaSource[]): boolean;

156

157

/**

158

* Set the dimensions of the media element

159

* @param width - Width in pixels

160

* @param height - Height in pixels

161

*/

162

setSize(width: number, height: number): void;

163

164

/**

165

* Generate and dispatch an error event

166

* @param message - Error message

167

* @param urlList - List of URLs that failed to load

168

*/

169

generateError(message: string, urlList: string[]): void;

170

171

/**

172

* Destroy the MediaElement instance and restore original element

173

*/

174

destroy(): void;

175

```

176

177

**Usage Examples:**

178

179

```javascript

180

// Basic playback control

181

const mediaElement = new MediaElement('video');

182

183

await mediaElement.play();

184

mediaElement.pause();

185

186

// Set properties

187

mediaElement.volume = 0.5;

188

mediaElement.currentTime = 30;

189

mediaElement.muted = true;

190

191

// Check format support

192

const canPlay = mediaElement.canPlayType('video/mp4');

193

if (canPlay === 'probably') {

194

mediaElement.src = 'video.mp4';

195

}

196

197

// Switch renderer for streaming content

198

const switched = mediaElement.changeRenderer('hls', [

199

{ src: 'stream.m3u8', type: 'application/vnd.apple.mpegurl' }

200

]);

201

202

// Resize element

203

mediaElement.setSize(640, 360);

204

205

// Clean up

206

mediaElement.destroy();

207

```

208

209

### Events

210

211

MediaElement supports all standard HTML5 media events plus custom events.

212

213

```javascript { .api }

214

// Standard HTML5 events

215

const mediaEvents = [

216

'loadstart', 'durationchange', 'loadedmetadata', 'loadeddata',

217

'progress', 'canplay', 'canplaythrough', 'suspend', 'abort',

218

'error', 'emptied', 'stalled', 'play', 'playing', 'pause',

219

'waiting', 'seeking', 'seeked', 'timeupdate', 'ended',

220

'ratechange', 'volumechange'

221

];

222

223

// Custom MediaElement events

224

const customEvents = [

225

'rendererready' // Fired when renderer is initialized and ready

226

];

227

```

228

229

**Event Handling Examples:**

230

231

```javascript

232

const mediaElement = new MediaElement('video');

233

234

// Listen for standard events

235

mediaElement.addEventListener('play', () => {

236

console.log('Playback started');

237

});

238

239

mediaElement.addEventListener('timeupdate', () => {

240

console.log(`Current time: ${mediaElement.currentTime}`);

241

});

242

243

mediaElement.addEventListener('error', (e) => {

244

console.error('Media error:', e);

245

});

246

247

// Listen for custom events

248

mediaElement.addEventListener('rendererready', () => {

249

console.log('Renderer is ready');

250

});

251

```

252

253

## Error Handling

254

255

MediaElement provides comprehensive error handling with detailed error information.

256

257

```javascript { .api }

258

interface MediaError {

259

/** Error code (1-4 following HTML5 spec) */

260

code: number;

261

/** Human-readable error message */

262

message: string;

263

}

264

265

// Error codes

266

const MEDIA_ERR_ABORTED = 1; // Media loading aborted

267

const MEDIA_ERR_NETWORK = 2; // Network error

268

const MEDIA_ERR_DECODE = 3; // Media decode error

269

const MEDIA_ERR_SRC_NOT_SUPPORTED = 4; // Media format not supported

270

```

271

272

**Error Handling Example:**

273

274

```javascript

275

mediaElement.addEventListener('error', () => {

276

const error = mediaElement.error;

277

switch (error.code) {

278

case 1:

279

console.log('Media loading was aborted');

280

break;

281

case 2:

282

console.log('Network error occurred');

283

break;

284

case 3:

285

console.log('Media decode error');

286

break;

287

case 4:

288

console.log('Media format not supported');

289

break;

290

}

291

});

292

```