Skip to content

Commit 5495ac6

Browse files
authored
Add basic Python API for streaming encoder (#1386)
1 parent 07a1854 commit 5495ac6

2 files changed

Lines changed: 451 additions & 0 deletions

File tree

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from typing import Any
2+
3+
from torch import Tensor
4+
5+
from torchcodec import _core
6+
7+
8+
class _VideoStream:
9+
def __init__(self, encoder_tensor: Tensor):
10+
self._encoder_tensor = encoder_tensor
11+
12+
def write(self, frames: Tensor) -> None:
13+
_core.streaming_encoder_add_frames(self._encoder_tensor, frames)
14+
15+
16+
class _AudioStream:
17+
def __init__(self, encoder_tensor: Tensor):
18+
self._encoder_tensor = encoder_tensor
19+
20+
def write(self, samples: Tensor) -> None:
21+
_core.streaming_encoder_add_samples(self._encoder_tensor, samples)
22+
23+
24+
class StreamingEncoder:
25+
def __init__(self, dest, *, format: str | None = None):
26+
if format is not None:
27+
self._encoder_tensor = _core.create_streaming_encoder_to_file_like(
28+
format, dest
29+
)
30+
else:
31+
self._encoder_tensor = _core.create_streaming_encoder_to_file(str(dest))
32+
33+
def add_video(
34+
self,
35+
*,
36+
height: int,
37+
width: int,
38+
frame_rate: float,
39+
device: str = "cpu",
40+
codec: str | None = None,
41+
pixel_format: str | None = None,
42+
crf: int | float | None = None,
43+
preset: str | int | None = None,
44+
extra_options: dict[str, Any] | None = None,
45+
) -> _VideoStream:
46+
preset = str(preset) if isinstance(preset, int) else preset
47+
_core.streaming_encoder_add_video_stream(
48+
self._encoder_tensor,
49+
height=height,
50+
width=width,
51+
frame_rate=frame_rate,
52+
device=device,
53+
codec=codec,
54+
pixel_format=pixel_format,
55+
crf=crf,
56+
preset=preset,
57+
extra_options=[
58+
str(x) for k, v in (extra_options or {}).items() for x in (k, v)
59+
],
60+
)
61+
return _VideoStream(self._encoder_tensor)
62+
63+
def add_audio(
64+
self,
65+
*,
66+
sample_rate: int,
67+
num_channels: int,
68+
bit_rate: int | None = None,
69+
) -> _AudioStream:
70+
_core.streaming_encoder_add_audio_stream(
71+
self._encoder_tensor,
72+
sample_rate=sample_rate,
73+
num_channels=num_channels,
74+
bit_rate=bit_rate,
75+
)
76+
return _AudioStream(self._encoder_tensor)
77+
78+
def open(self) -> None:
79+
_core.streaming_encoder_open(self._encoder_tensor)
80+
81+
def close(self) -> None:
82+
_core.streaming_encoder_close(self._encoder_tensor)

0 commit comments

Comments
 (0)