D-Link DCS-5010L is a pretty old generation Pan & Tilt WIFI network camera. It is so old, only can be accessed with old IE web browser as it needs ActiveX. For Edge, may work by using IE mode. And almost impossible to use Firefox or Chrome browser. And for some feature and function, would need java installed. And it might not work due to old firmware and interface.
D-Link's Android app even cannot connect to the camera. Give up on that as so frustrate. The TinyCam app can view and control the movement of the camera, but
cannot change video resolution, codec type, and motion detection setting.
So come to the idea to use Python script to control and view the camera, more flexibility. Later, may think to make my own Android app for the camera. There is github dlink-dcs-python-lib can be used as lib or reference. This lib has unit test code, but does not have stream video viewer code. Github copilot suggests to use opencv-python for video processing and use requests for handling HTTP requests. Code like below, worked quite well:
import cv2
import requests
import numpy as np
import os
CAM_HOST = os.environ.get('CAM_HOST') or ''
CAM_PORT = os.environ.get('CAM_PORT', 80)
CAM_USER = os.getenv('CAM_USER', 'admin')
CAM_PASS = os.getenv('CAM_PASS', '')
# URL of the video stream
stream_url = f'http://{CAM_HOST}:{CAM_PORT}/video.cgi'
# Start a session
session = requests.Session()
response = session.get(stream_url, stream=True, auth=(CAM_USER, CAM_PASS))
# Check if the connection to the stream is successful
if response.status_code == 200:
bytes_data = bytes()
for chunk in response.iter_content(chunk_size=1024):
bytes_data += chunk
a = bytes_data.find(b'\xff\xd8') # JPEG start
b = bytes_data.find(b'\xff\xd9') # JPEG end
if a != -1 and b != -1:
jpg = bytes_data[a:b+2] # Extract the JPEG image
bytes_data = bytes_data[b+2:] # Remove the processed bytes
frame = cv2.imdecode(np.frombuffer(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
if frame is not None:
cv2.imshow('Video Stream', frame)
if cv2.waitKey(1) & 0xFF == ord('q'): # Exit loop if 'q' is pressed
break
cv2.destroyAllWindows()
else:
print("Failed to connect to the stream.")
Above code is for viewing Motion Jpeg. To view h.264 stream, can use below code:
import cv2
import os
# URL of the H.264 video stream
CAM_HOST = os.environ.get('CAM_HOST') or ''
CAM_PORT = os.environ.get('CAM_PORT', 80)
CAM_USER = os.getenv('CAM_USER', 'admin')
CAM_PASS = os.getenv('CAM_PASS', '')
# URL of the video stream
stream_url = f'http://{CAM_USER}:{CAM_PASS}@{CAM_HOST}:{CAM_PORT}/video.cgi'
# Create a VideoCapture object
cap = cv2.VideoCapture(stream_url)
# Check if camera opened successfully
if not cap.isOpened():
print("Error: Could not open video stream.")
else:
# Read until video is completed
while cap.isOpened():
# Capture frame-by-frame
ret, frame = cap.read()
if ret:
# Display the resulting frame
cv2.imshow('Video Stream', frame)
# Press Q on keyboard to exit
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# When everything done, release the video capture object
cap.release()
# Closes all the frames
cv2.destroyAllWindows()
0 Comments:
Post a Comment