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()