# Track generators

Tracks of media the application writes, with VideoTrackGenerator and the non-standard MediaStreamTrackGenerator.

### *class* webrtc.interfaces.track_generator.VideoTrackGenerator

A video track of the frames the application writes to a stream.

The visible rect of each [`webrtc.VideoFrame`](../models/video_frame.md#webrtc.models.video_frame.VideoFrame) written is sent on [`track`](#webrtc.interfaces.track_generator.VideoTrackGenerator.track), and the frame is closed.
Writing anything else or a closed frame errors [`writable`](#webrtc.interfaces.track_generator.VideoTrackGenerator.writable). Closing or aborting [`writable`](#webrtc.interfaces.track_generator.VideoTrackGenerator.writable) ends the
track.

See [MDN: VideoTrackGenerator](https://developer.mozilla.org/en-US/docs/Web/API/VideoTrackGenerator).

Example:

```default
generator = webrtc.VideoTrackGenerator()
pc.add_track(generator.track)
writer = generator.writable.get_writer()
init = webrtc.VideoFrameBufferInit(format='I420', coded_width=640, coded_height=480, timestamp=0)
await writer.write(webrtc.VideoFrame(i420, init))
```

#### *property* track *: [MediaStreamTrack](media_stream_track.md#webrtc.interfaces.media_stream_track.MediaStreamTrack)*

The video track carrying the frames written.

See [MDN: VideoTrackGenerator/track](https://developer.mozilla.org/en-US/docs/Web/API/VideoTrackGenerator/track).

* **Type:**
  [`webrtc.MediaStreamTrack`](media_stream_track.md#webrtc.interfaces.media_stream_track.MediaStreamTrack)

#### *property* writable *: [WritableStream](../streams.md#webrtc.streams.WritableStream)*

The stream to write [`webrtc.VideoFrame`](../models/video_frame.md#webrtc.models.video_frame.VideoFrame) objects to.

See [MDN: VideoTrackGenerator/writable](https://developer.mozilla.org/en-US/docs/Web/API/VideoTrackGenerator/writable).

* **Type:**
  [`webrtc.WritableStream`](../streams.md#webrtc.streams.WritableStream)

#### *property* muted *: [bool](https://docs.python.org/3/builtins/functions.html#bool)*

Whether written frames are dropped. [`track`](#webrtc.interfaces.track_generator.VideoTrackGenerator.track) stays muted while it’s [`True`](https://docs.python.org/3/builtins/constants.html#True).

It starts as [`False`](https://docs.python.org/3/builtins/constants.html#False).

See [MDN: VideoTrackGenerator/muted](https://developer.mozilla.org/en-US/docs/Web/API/VideoTrackGenerator/muted).

* **Type:**
  [`bool`](https://docs.python.org/3/builtins/functions.html#bool)

### *class* webrtc.interfaces.track_generator.MediaStreamTrackGeneratorInit(kind)

The options of a [`MediaStreamTrackGenerator`](#webrtc.interfaces.track_generator.MediaStreamTrackGenerator).

* **Parameters:**
  **kind** ([`webrtc.MediaType`](../enums.md#webrtc.enums.MediaType)) – The kind of the track, `'audio'` or `'video'`.

### *class* webrtc.interfaces.track_generator.MediaStreamTrackGenerator(kind)

A track of the [`webrtc.VideoFrame`](../models/video_frame.md#webrtc.models.video_frame.VideoFrame) or [`webrtc.AudioData`](../models/audio_data.md#webrtc.models.audio_data.AudioData) objects the application writes to a stream.

It’s non-standard, but it’s the only way to generate audio. For video, [`VideoTrackGenerator`](#webrtc.interfaces.track_generator.VideoTrackGenerator) is the standard
choice. Unlike [`VideoTrackGenerator`](#webrtc.interfaces.track_generator.VideoTrackGenerator), this generator is the track itself.

Each object written is sent and closed. Audio is converted to 16-bit samples and sent in 10 ms frames. Samples
that don’t fill a frame wait for the next write. Writing the wrong kind of object or a closed one errors
[`writable`](#webrtc.interfaces.track_generator.MediaStreamTrackGenerator.writable). So does a sample rate the library can’t send, with [`webrtc.NotSupportedError`](../exceptions.md#webrtc.exceptions.NotSupportedError). Closing or
aborting [`writable`](#webrtc.interfaces.track_generator.MediaStreamTrackGenerator.writable) ends the track.

See [MDN: MediaStreamTrackGenerator](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrackGenerator).

* **Parameters:**
  **kind** ([`webrtc.MediaType`](../enums.md#webrtc.enums.MediaType), [`str`](https://docs.python.org/3/builtins/stdtypes.html#str) or [`MediaStreamTrackGeneratorInit`](#webrtc.interfaces.track_generator.MediaStreamTrackGeneratorInit)) – `'audio'` or `'video'`,
  or an init that holds it.
* **Raises:**
  [**TypeError**](https://docs.python.org/3/builtins/exceptions.html#TypeError) – If the kind isn’t audio or video.

### Events

- `mute`: [`Event`](../models/events.md#webrtc.models.events.Event)
- `unmute`: [`Event`](../models/events.md#webrtc.models.events.Event)
- `ended`: [`Event`](../models/events.md#webrtc.models.events.Event)

Handlers are registered with [`on()`](../events.md#webrtc.utils.events.UniformEventTarget.on).

#### *property* writable *: [WritableStream](../streams.md#webrtc.streams.WritableStream)*

The stream to write [`webrtc.VideoFrame`](../models/video_frame.md#webrtc.models.video_frame.VideoFrame) or [`webrtc.AudioData`](../models/audio_data.md#webrtc.models.audio_data.AudioData) to.

See [MDN: MediaStreamTrackGenerator/writable](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrackGenerator/writable).

* **Type:**
  [`webrtc.WritableStream`](../streams.md#webrtc.streams.WritableStream)
