@@ -49,6 +49,10 @@ class VideoRecorder(ObservationTransform):
49
49
if not.
50
50
out_keys (sequence of NestedKey, optional): destination keys. Defaults
51
51
to ``in_keys`` if not provided.
52
+ fps (int, optional): Frames per second of the output video. Defaults to the logger predefined ``fps``,
53
+ and overrides it if provided.
54
+ **kwargs (Dict[str, Any], optional): additional keyword arguments for
55
+ :meth:`~torchrl.record.loggers.Logger.log_video`.
52
56
53
57
Examples:
54
58
The following example shows how to save a rollout under a video. First a few imports:
@@ -81,10 +85,11 @@ class VideoRecorder(ObservationTransform):
81
85
>>> from torchrl.data.datasets import OpenXExperienceReplay
82
86
>>> from torchrl.envs import Compose
83
87
>>> from torchrl.record import VideoRecorder, CSVLogger
84
- >>> # Create a logger that saves videos as mp4
85
- >>> logger = CSVLogger("./dump", video_format="mp4")
88
+ >>> # Create a logger that saves videos as mp4 using 24 frames per sec
89
+ >>> logger = CSVLogger("./dump", video_format="mp4", video_fps=24 )
86
90
>>> # We use the VideoRecorder transform to save register the images coming from the batch.
87
- >>> t = VideoRecorder(logger=logger, tag="pixels", in_keys=[("next", "observation", "image")])
91
+ >>> # Setting the fps to 12 overrides the one set in the logger, not doing so keeps it unchanged.
92
+ >>> t = VideoRecorder(logger=logger, tag="pixels", in_keys=[("next", "observation", "image")], fps=12)
88
93
>>> # Each batch of data will have 10 consecutive videos of 200 frames each (maximum, since strict_length=False)
89
94
>>> dataset = OpenXExperienceReplay("cmu_stretch", batch_size=2000, slice_len=200,
90
95
... download=True, strict_length=False,
@@ -108,15 +113,18 @@ def __init__(
108
113
center_crop : Optional [int ] = None ,
109
114
make_grid : bool | None = None ,
110
115
out_keys : Optional [Sequence [NestedKey ]] = None ,
116
+ fps : int | None = None ,
111
117
** kwargs ,
112
118
) -> None :
113
119
if in_keys is None :
114
120
in_keys = ["pixels" ]
115
121
if out_keys is None :
116
122
out_keys = copy (in_keys )
117
123
super ().__init__ (in_keys = in_keys , out_keys = out_keys )
118
- video_kwargs = {"fps" : 6 }
124
+ video_kwargs = {}
119
125
video_kwargs .update (kwargs )
126
+ if fps is not None :
127
+ self .video_kwargs ["fps" ] = fps
120
128
self .video_kwargs = video_kwargs
121
129
self .iter = 0
122
130
self .skip = skip
0 commit comments