Spaces:
Running
Running
File size: 975 Bytes
8c424b3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | """Helpers for encoding camera frames."""
from fractions import Fraction
import av
import numpy as np
from numpy.typing import NDArray
def encode_bgr_frame_as_jpeg(frame: NDArray[np.uint8]) -> bytes:
"""Encode a BGR camera frame as JPEG bytes."""
rgb_frame = np.ascontiguousarray(frame[..., ::-1])
video_frame = av.VideoFrame.from_ndarray(rgb_frame, format="rgb24")
codec = av.CodecContext.create("mjpeg", "w")
codec.width = rgb_frame.shape[1] # type: ignore[attr-defined]
codec.height = rgb_frame.shape[0] # type: ignore[attr-defined]
codec.pix_fmt = "yuvj444p" # type: ignore[attr-defined]
codec.time_base = Fraction(1, 1)
codec.options = {"qscale": "3"}
packets = codec.encode(video_frame) # type: ignore[attr-defined]
packets += codec.encode(None) # type: ignore[attr-defined]
if not packets:
raise RuntimeError("Failed to encode frame as JPEG")
return b"".join(bytes(packet) for packet in packets)
|