Spaces:
Running
Running
| """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) | |