Skip to content

Video Quality Appears Noticeably Blurry When Using Python SDK #85

Closed
@chengch1016

Description

@chengch1016

I successfully uploaded my video stream using the Python SDK on my PC.

I utilized https://meet.livekit.io/?tab=custom for frontend display. Simultaneously, locally, I displayed real-time images from my camera using OpenCV. The local image resolution is 720*1280. However, on https://meet.livekit.io/?tab=custom, the video appears noticeably blurry.

Could you please advise on potential reasons? Is it possible that I haven't configured the settings correctly in my code?

Below is my code (I've omitted the token due to security reasons):

import asyncio
import logging
from signal import SIGINT, SIGTERM

import cv2
import numpy as np
from livekit import rtc

URL = "ws://localhost"
TOKEN = ""


async def publish_camera_video_stream(source: rtc.VideoSource):
    argb_frame = None
    arr = None

    cap = cv2.VideoCapture(0)

    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

    while True:
        ret, frame = cap.read()

        if not ret:
            continue

        logging.info(f"frame type: {type(frame)}")
        logging.info(f"frame shape: {frame.shape}")

        if frame is not None and argb_frame is None and arr is None:
            height, width, _ = frame.shape
            logging.info(f"Height: {height}, Width: {width}")
            argb_frame = rtc.ArgbFrame.create(rtc.VideoFormatType.FORMAT_ARGB, width, height*2)
            arr = np.frombuffer(argb_frame.data, dtype=np.uint8)

        logging.info(f"argb_frame: {argb_frame.data.shape}")

        flipped_frame = cv2.flip(frame, 0)

        combined_frame = cv2.vconcat([frame, flipped_frame])

        cv2.imshow("Video Stream", combined_frame)

        arr.flat[::4] = combined_frame[:, :, 0].ravel()
        arr.flat[1::4] = combined_frame[:, :, 1].ravel()
        arr.flat[2::4] = combined_frame[:, :, 2].ravel()
        arr.flat[3::4] = 0

        video_frame = rtc.VideoFrame(
            0, rtc.VideoRotation.VIDEO_ROTATION_0, argb_frame.to_i420()
        )

        source.capture_frame(video_frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()


async def main(room: rtc.Room):
    logging.info("connecting to %s", URL)
    try:
        await room.connect(URL, TOKEN)
        logging.info("connected to room %s", room.name)
    except rtc.ConnectError as e:
        logging.error("failed to connect to the room: %s", e)
        return

    # publish a track
    source = rtc.VideoSource()
    track = rtc.LocalVideoTrack.create_video_track("hue", source)
    options = rtc.TrackPublishOptions()
    options.source = rtc.TrackSource.SOURCE_CAMERA
    publication = await room.local_participant.publish_track(track, options)
    logging.info("published track %s", publication.sid)

    asyncio.ensure_future(publish_camera_video_stream(source))


if __name__ == "__main__":
    logging.basicConfig(
        level=logging.INFO,
        handlers=[logging.FileHandler("publish_hue.log"), logging.StreamHandler()],
    )

    loop = asyncio.get_event_loop()
    room = rtc.Room(loop=loop)

    async def cleanup():
        await room.disconnect()
        loop.stop()

    asyncio.ensure_future(main(room))
    for signal in [SIGINT, SIGTERM]:
        loop.add_signal_handler(signal, lambda: asyncio.ensure_future(cleanup()))

    try:
        loop.run_forever()
    finally:
        loop.close()

I would greatly appreciate any insights or guidance to resolve this resolution issue during the video stream. Thank you for your assistance

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions