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