Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Video Quality Appears Noticeably Blurry When Using Python SDK #85

Closed
chengch1016 opened this issue Nov 1, 2023 · 2 comments · Fixed by #88
Closed

Video Quality Appears Noticeably Blurry When Using Python SDK #85

chengch1016 opened this issue Nov 1, 2023 · 2 comments · Fixed by #88
Assignees

Comments

@chengch1016
Copy link

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

@theomonnom
Copy link
Member

Hey, I just reproduced the issue, thanks for the code example.
I'll release a fix today

@theomonnom
Copy link
Member

theomonnom commented Nov 5, 2023

Hey, this will be fixed by #88. It adds width and height arguments to the VideoSource

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants