VideoEncoder¶
VideoEncoder node is used to encode ImgFrame into either H264, H265, or MJPEG streams. Only NV12 or GRAY8 (which gets converted to NV12) format is supported as an input. All codecs are lossy (except lossless MJPEG), for more information please see encoding quality docs.
Encoded bitstream (either MJPEG, H264, or H265) from the device can also be saved directly into .mp4 container with no computational overhead on the host computer. See demo here for more information.
Matroska
Besides ffmpeg
and .mp4
video container (which is patent encumbered), you could also use the mkvmerge
(see MKVToolNix for GUI usage) and .mkv
video container
to mux encoded stream into video file that is supported by all major video players
(eg. VLC)
mkvmerge -o vid.mkv video.h265
How to place it¶
pipeline = dai.Pipeline()
encoder = pipeline.create(dai.node.VideoEncoder)
dai::Pipeline pipeline;
auto encoder = pipeline.create<dai::node::VideoEncoder>();
Inputs and Outputs¶
┌──────────────┐
│ │ bitstream
input │ ├────────►
─────────►│ VideoEncoder |
│ │ out
│ ├────────►
└──────────────┘
Message types
input
- ImgFrame (NV12/GRAY8)bitstream
- ImgFrameout
- EncodedFrame
Usage¶
pipeline = dai.Pipeline()
# Create ColorCamera beforehand
# Set H265 encoding for the ColorCamera video output
videoEncoder = pipeline.create(dai.node.VideoEncoder)
videoEncoder.setDefaultProfilePreset(cam.getFps(), dai.VideoEncoderProperties.Profile.H265_MAIN)
videoEncoder.setBitrateKbps(500) # 0.5 Mbps
# Create MJPEG encoding for still images
stillEncoder = pipeline.create(dai.node.VideoEncoder)
stillEncoder.setDefaultProfilePreset(1, dai.VideoEncoderProperties.Profile.MJPEG)
# stillEncoder.setLossless(True) # Lossless only for MJPEG
stillEncoder.setQuality(90) # 0-100, 100 being the best quality (not lossless though)
cam.still.link(stillEncoder.input)
cam.video.link(videoEncoder.input)
dai::Pipeline pipeline;
// Create ColorCamera beforehand
// Set H265 encoding for the ColorCamera video output
auto videoEncoder = pipeline.create<dai::node::VideoEncoder>();
videoEncoder->setDefaultProfilePreset(cam->getFps(), dai::VideoEncoderProperties::Profile::H265_MAIN);
videoEncoder->setBitrateKbps(500); // 0.5 Mbps
// Create MJPEG encoding for still images
stillEncoder = pipeline.create(dai.node.VideoEncoder);
stillEncoder->setDefaultProfilePreset(1, dai::VideoEncoderProperties::Profile::MJPEG);
// stillEncoder->setLossless(true); // Lossless only for MJPEG
stillEncoder->setQuality(90); // 0-100, 100 being the best quality (not lossless though)
cam->still.link(stillEncoder->input);
cam->video.link(videoEncoder->input);
Limitations¶
For H.264 / H.265 encoding, we have the following limits: - 248 million pixels/second (4K@30) limit for the encoder. The resolution and frame rate can be divided into multiple streams - but the sum of all the pixels/second needs to be below 248 million. - Due to a HW constraint, video encoding can be done only on frames whose width values are multiples of 32. - 4096 pixel max width for a frame.
The MJPEG encoder is capable of 16384x8192 resolution at 450 MPix/sec. From our testing, we were able to encode 4K at 30FPS and 2x 800P at 55FPS.
Note the processing resources of the encoder are shared between H.26x and JPEG.
Examples of functionality¶
Reference¶
-
class
depthai.node.
VideoEncoder
-
class
Id
Node identificator. Unique for every node on a single Pipeline
-
getAssetManager
(*args, **kwargs) Overloaded function.
getAssetManager(self: depthai.Node) -> depthai.AssetManager
getAssetManager(self: depthai.Node) -> depthai.AssetManager
-
getBitrate
(self: depthai.node.VideoEncoder) → int
-
getBitrateKbps
(self: depthai.node.VideoEncoder) → int
-
getFrameRate
(self: depthai.node.VideoEncoder) → float
-
getHeight
(self: depthai.node.VideoEncoder) → int
-
getInputRefs
(*args, **kwargs) Overloaded function.
getInputRefs(self: depthai.Node) -> list[depthai.Node.Input]
getInputRefs(self: depthai.Node) -> list[depthai.Node.Input]
-
getInputs
(self: depthai.Node) → list[depthai.Node.Input]
-
getKeyframeFrequency
(self: depthai.node.VideoEncoder) → int
-
getLossless
(self: depthai.node.VideoEncoder) → bool
-
getMaxOutputFrameSize
(self: depthai.node.VideoEncoder) → int
-
getName
(self: depthai.Node) → str
-
getNumBFrames
(self: depthai.node.VideoEncoder) → int
-
getNumFramesPool
(self: depthai.node.VideoEncoder) → int
-
getOutputRefs
(*args, **kwargs) Overloaded function.
getOutputRefs(self: depthai.Node) -> list[depthai.Node.Output]
getOutputRefs(self: depthai.Node) -> list[depthai.Node.Output]
-
getOutputs
(self: depthai.Node) → list[depthai.Node.Output]
-
getParentPipeline
(*args, **kwargs) Overloaded function.
getParentPipeline(self: depthai.Node) -> depthai.Pipeline
getParentPipeline(self: depthai.Node) -> depthai.Pipeline
-
getProfile
(self: depthai.node.VideoEncoder) → depthai.VideoEncoderProperties.Profile
-
getQuality
(self: depthai.node.VideoEncoder) → int
-
getRateControlMode
(self: depthai.node.VideoEncoder) → depthai.VideoEncoderProperties.RateControlMode
-
getSize
(self: depthai.node.VideoEncoder) → tuple[int, int]
-
getWidth
(self: depthai.node.VideoEncoder) → int
-
setBitrate
(self: depthai.node.VideoEncoder, bitrate: int) → None
-
setBitrateKbps
(self: depthai.node.VideoEncoder, bitrateKbps: int) → None
-
setDefaultProfilePreset
(*args, **kwargs) Overloaded function.
setDefaultProfilePreset(self: depthai.node.VideoEncoder, fps: float, profile: depthai.VideoEncoderProperties.Profile) -> None
setDefaultProfilePreset(self: depthai.node.VideoEncoder, arg0: int, arg1: int, arg2: float, arg3: depthai.VideoEncoderProperties.Profile) -> None
setDefaultProfilePreset(self: depthai.node.VideoEncoder, arg0: tuple[int, int], arg1: float, arg2: depthai.VideoEncoderProperties.Profile) -> None
-
setFrameRate
(self: depthai.node.VideoEncoder, frameRate: float) → None
-
setKeyframeFrequency
(self: depthai.node.VideoEncoder, freq: int) → None
-
setLossless
(self: depthai.node.VideoEncoder, arg0: bool) → None
-
setMaxOutputFrameSize
(self: depthai.node.VideoEncoder, maxFrameSize: int) → None
-
setNumBFrames
(self: depthai.node.VideoEncoder, numBFrames: int) → None
-
setNumFramesPool
(self: depthai.node.VideoEncoder, frames: int) → None
-
setProfile
(*args, **kwargs) Overloaded function.
setProfile(self: depthai.node.VideoEncoder, profile: depthai.VideoEncoderProperties.Profile) -> None
setProfile(self: depthai.node.VideoEncoder, arg0: tuple[int, int], arg1: depthai.VideoEncoderProperties.Profile) -> None
setProfile(self: depthai.node.VideoEncoder, arg0: int, arg1: int, arg2: depthai.VideoEncoderProperties.Profile) -> None
-
setQuality
(self: depthai.node.VideoEncoder, quality: int) → None
-
setRateControlMode
(self: depthai.node.VideoEncoder, mode: depthai.VideoEncoderProperties.RateControlMode) → None
-
class
-
class
dai::node
::
VideoEncoder
: public dai::NodeCRTP<Node, VideoEncoder, VideoEncoderProperties>¶ VideoEncoder node. Encodes frames into MJPEG, H264 or H265.
Public Functions
-
void
setDefaultProfilePreset
(float fps, Properties::Profile profile)¶ Sets a default preset based on specified frame rate and profile
- Parameters
fps
: Frame rate in frames per secondprofile
: Encoding profile
-
void
setDefaultProfilePreset
(int width, int height, float fps, Properties::Profile profile)¶ Sets a default preset based on specified input size, frame rate and profile
- Parameters
width
: Input frame widthheight
: Input frame heightfps
: Frame rate in frames per secondprofile
: Encoding profile
-
void
setDefaultProfilePreset
(std::tuple<int, int> size, float fps, Properties::Profile profile)¶ Sets a default preset based on specified input size, frame rate and profile
- Parameters
size
: Input frame sizefps
: Frame rate in frames per secondprofile
: Encoding profile
-
void
setNumFramesPool
(int frames)¶ Set number of frames in pool
- Parameters
frames
: Number of pool frames
-
int
getNumFramesPool
() const¶ Get number of frames in pool
- Return
Number of pool frames
-
void
setRateControlMode
(Properties::RateControlMode mode)¶ Set rate control mode Applicable only to H264 and H265 profiles.
-
void
setProfile
(Properties::Profile profile)¶ Set encoding profile.
-
void
setProfile
(std::tuple<int, int> size, Properties::Profile profile)¶ Set encoding profile.
-
void
setProfile
(int width, int height, Properties::Profile profile)¶ Set encoding profile.
-
void
setBitrate
(int bitrate)¶ Set output bitrate in bps, for CBR rate control mode. 0 for auto (based on frame size and FPS). Applicable only to H264 and H265 profiles.
-
void
setBitrateKbps
(int bitrateKbps)¶ Set output bitrate in kbps, for CBR rate control mode. 0 for auto (based on frame size and FPS). Applicable only to H264 and H265 profiles.
-
void
setKeyframeFrequency
(int freq)¶ Set keyframe frequency. Every Nth frame a keyframe is inserted.
Applicable only to H264 and H265 profiles
Examples:
30 FPS video, keyframe frequency: 30. Every 1s a keyframe will be inserted
60 FPS video, keyframe frequency: 180. Every 3s a keyframe will be inserted
-
void
setNumBFrames
(int numBFrames)¶ Set number of B frames to be inserted. Applicable only to H264 and H265 profiles.
-
void
setQuality
(int quality)¶ Set quality for [M]JPEG profile
- Parameters
quality
: Value between 0-100%. Approximates quality
-
void
setLossless
(bool lossless)¶ Set lossless mode. Applies only to [M]JPEG profile
- Parameters
lossless
: True to enable lossless jpeg encoding, false otherwise
-
void
setFrameRate
(float frameRate)¶ Sets expected frame rate
- Parameters
frameRate
: Frame rate in frames per second
-
void
setMaxOutputFrameSize
(int maxFrameSize)¶ Specifies maximum output encoded frame size
-
Properties::RateControlMode
getRateControlMode
() const¶ Get rate control mode.
-
Properties::Profile
getProfile
() const¶ Get profile.
-
int
getBitrate
() const¶ Get bitrate in bps.
-
int
getBitrateKbps
() const¶ Get bitrate in kbps.
-
int
getKeyframeFrequency
() const¶ Get keyframe frequency.
-
int
getNumBFrames
() const¶ Get number of B frames.
-
int
getQuality
() const¶ Get quality.
-
std::tuple<int, int>
getSize
() const¶ Get input size.
-
int
getWidth
() const¶ Get input width.
-
int
getHeight
() const¶ Get input height.
-
float
getFrameRate
() const¶ Get frame rate.
-
bool
getLossless
() const¶ Get lossless mode. Applies only when using [M]JPEG profile.
-
int
getMaxOutputFrameSize
() const¶
Public Members
-
Input
input
= {*this, "in", Input::Type::SReceiver, true, 4, true, {{DatatypeEnum::ImgFrame, true}}}¶ Input for NV12 ImgFrame to be encoded Default queue is blocking with size set by ‘setNumFramesPool’ (4).
-
Output
bitstream
= {*this, "bitstream", Output::Type::MSender, {{DatatypeEnum::ImgFrame, false}}}¶ Outputs ImgFrame message that carries BITSTREAM encoded (MJPEG, H264 or H265) frame data. Mutually exclusive with out.
-
Output
out
= {*this, "out", Output::Type::MSender, {{DatatypeEnum::EncodedFrame, false}}}¶ Outputs EncodedFrame message that carries encoded (MJPEG, H264 or H265) frame data. Mutually exclusive with bitstream.
Public Static Attributes
-
static constexpr const char *
NAME
= "VideoEncoder"¶
-
void