Unable to open webcam in Streamlit in cloud envirement

I am developing a Streamlit application that is intended to access and capture video from a webcam. The application works locally but encounters issues when deployed on an Amazon EC2 instance. Below, Iā€™ve detailed the applicationā€™s functionality, the issues Iā€™m facing, and the steps Iā€™ve taken so far.

  • Functionality: The application uses streamlit_webrtc, an extension of Streamlit, to access the webcam and capture video frames. The captured frames are processed and displayed within the Streamlit interface.
  • Libraries and Tools: The key Python libraries used in this project include Streamlit, streamlit_webrtc, OpenCV (cv2), and asyncio.

Issues Encountered on EC2:

Exception in callback Transaction.__retry()
handle: <TimerHandle when=4213.466461538 Transaction.__retry()>
Traceback (most recent call last):
File ā€œ/usr/lib64/python3.9/asyncio/selector_events.pyā€, line 1054, in sendto
self._sock.sendto(data, addr)
AttributeError: ā€˜NoneTypeā€™ object has no attribute ā€˜sendtoā€™

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "/usr/lib64/python3.9/asyncio/events.py", line 80, in _run
    self._context.run(self._callback, *self._args)
  File "/home/ec2-user/.local/lib/python3.9/site-packages/aioice/stun.py", line 312, in __retry
    self.__protocol.send_stun(self.__request, self.__addr)
  File "/home/ec2-user/.local/lib/python3.9/site-packages/aioice/ice.py", line 266, in send_stun
    self.transport.sendto(bytes(message), addr)
  File "/usr/lib64/python3.9/asyncio/selector_events.py", line 1064, in sendto
    self._fatal_error(
  File "/usr/lib64/python3.9/asyncio/selector_events.py", line 711, in _fatal_error
    self._loop.call_exception_handler({
AttributeError: 'NoneType' object has no attribute 'call_exception_handler'

And here is my source code:

import streamlit as st
from streamlit_webrtc import webrtc_streamer, RTCConfiguration, VideoProcessorBase
import av

RTC_CONFIGURATION = RTCConfiguration(
    {"iceServers": [{"urls": ["stun:stun.l.google.com:19302"]}]}
)

class VideoProcessor(VideoProcessorBase):
    def recv(self, frame):
        img = frame.to_ndarray(format="bgr24")
        return av.VideoFrame.from_ndarray(img, format="bgr24")

def main():
    st.title("Webcam Live Feed")

    webrtc_ctx = webrtc_streamer(key="example", 
                                 rtc_configuration=RTC_CONFIGURATION, 
                                 video_processor_factory=VideoProcessor, 
                                 media_stream_constraints={"video": True, "audio": False})

    if st.button("Capture"):
        if webrtc_ctx.video_processor:
            frame = webrtc_ctx.video_frame.to_image()  # Capturing the frame as an image
            st.image(frame, caption="Captured Image", use_column_width=True)

if __name__ == "__main__":
    main()

Hi @yusufsuzyusuf

Have you tried going over the GitHub issues for webrtc Issues Ā· whitphx/streamlit-webrtc Ā· GitHub which is a great resource for troubleshooting issues when using webrtc

Hope this helps!