৫৮. রিয়েল-টাইম ভিডিও স্ট্রিমিং সার্ভার (Video Streaming Server)
নেটফ্লিক্স বা ইউটিউব লাইভ কীভাবে আমাদের মোবাইলে রিয়েল-টাইম ভিডিও স্ট্রিম (Stream) করে? এই প্রজেক্টে আমরা নিজেদের ল্যাপটপ বা কম্পিউটারকে একটি লাইভ স্ট্রিমিং সার্ভারে পরিণত করবো।
আমরা পাইথনের Flask এবং OpenCV ব্যবহার করে এমন একটি ওয়েবসাইট বানাবো, যেখানে ঢুকলে আপনার ল্যাপটপের ওয়েবক্যামের লাইভ ভিডিও দেখা যাবে। আর সবচেয়ে মজার বিষয় হলো, আপনি যদি ল্যাপটপের ওয়াইফাইয়ের সাথে আপনার মোবাইল কানেক্ট করেন, তবে মোবাইল থেকেও লাইভ ভিডিওটি দেখতে পাবেন!
কীভাবে কাজ করে? (How it works):
- Camera Feed:
OpenCVব্যবহার করে ওয়েবক্যাম থেকে কন্টিনিউয়াসলি ভিডিও ফ্রেম (ছবি) ক্যাপচার করা হবে। - Image Encoding: ফ্রেমগুলোকে JPEG ফরম্যাটে এনকোড (Encode) করে ডেটা সাইজ ছোট করা হবে।
- HTTP Streaming:
Flaskফ্রেমওয়ার্ক ব্যবহার করে আমরা একটি সার্ভার বানাবো। এটি Multipart/x-mixed-replace নামের একটি স্পেশাল প্রোটোকল ব্যবহার করে একটার পর একটা ফ্রেম ব্রাউজারে পাঠাতে থাকবে, যা দেখতে একদম স্মুথ লাইভ ভিডিওর মতো মনে হবে।
প্রয়োজনীয় লাইব্রেরি (Libraries):
টার্মিনালে নিচের কমান্ডটি লিখে লাইব্রেরিগুলো ইনস্টল করে নিন:
pip install flask opencv-python
প্রজেক্টের কোড:
নিচের কোডটি একটি ফাইলে (যেমন: app.py) সেভ করুন এবং রান করুন।
from flask import Flask, render_template_string, Response
import cv2
app = Flask(__name__)
# ফ্রন্টএন্ড বা ওয়েবসাইটের HTML কোড (আলাদা ফাইল না বানিয়ে এখানেই লেখা হয়েছে)
html_page = """
<!DOCTYPE html>
<html>
<head>
<title>Live Video Stream</title>
</head>
<body style="text-align: center; background-color: #222; color: white;">
<h1>Live Webcam Stream</h1>
<!-- img ট্যাগের ভেতর লাইভ ফ্রেমগুলো রিপ্লেস হতে থাকবে -->
<img src="{{ url_for('video_feed') }}" style="border: 5px solid white; width: 640px; height: 480px;">
</body>
</html>
"""
def generate_frames():
"""ওয়েবক্যাম থেকে রিয়েল-টাইমে ভিডিও ফ্রেম ক্যাপচার করার ফাংশন"""
# 0 মানে ল্যাপটপের ডিফল্ট ওয়েবক্যাম
camera = cv2.VideoCapture(0)
while True:
# ক্যামেরা থেকে একটি ফ্রেম পড়া
success, frame = camera.read()
if not success:
break
else:
# ফ্রেমটিকে ব্রাউজারে পাঠানোর জন্য JPEG ফরম্যাটে কনভার্ট করা
ret, buffer = cv2.imencode('.jpg', frame)
frame_bytes = buffer.tobytes()
# স্পেশাল HTTP রেসপন্স জেনারেট করা, যা ব্রাউজারকে বোঝাবে এটি একটি ভিডিও স্ট্রিম
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame_bytes + b'\r\n')
@app.route('/')
def index():
"""হোমপেজ লোড করার রাউট (Route)"""
return render_template_string(html_page)
@app.route('/video_feed')
def video_feed():
"""লাইভ ভিডিওর ডেটা পাঠানোর রাউট"""
# Response হিসেবে সাধারণ টেক্সট না দিয়ে জেনারেটর ফাংশন দেওয়া হয়েছে
return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == "__main__":
print("=== Starting Video Streaming Server ===")
print("Open this link in your browser: http://0.0.0.0:5000")
# 0.0.0.0 ব্যবহার করলে আপনার লোকাল নেটওয়ার্কে থাকা অন্য ডিভাইস (যেমন মোবাইল) থেকেও দেখা যাবে
app.run(host='0.0.0.0', port=5000, debug=True)
কীভাবে মোবাইলে দেখবেন?
- কোডটি রান করার পর ল্যাপটপের ব্রাউজারে
http://localhost:5000এ যান। লাইভ ভিডিও দেখতে পাবেন। - মোবাইলে দেখার জন্য প্রথমে আপনার ল্যাপটপ এবং মোবাইল একই ওয়াইফাই বা হটস্পটে কানেক্ট করুন।
- ল্যাপটপের টার্মিনালে
ipconfig(উইন্ডোজ) বাifconfig(ম্যাক/লিনাক্স) লিখে আপনার IPv4 অ্যাড্রেসটি বের করুন (যেমন:192.168.1.15)। - এবার মোবাইলের ব্রাউজারে গিয়ে লিখুন
http://192.168.1.15:5000। ম্যাজিক! আপনি মোবাইল থেকেও লাইভ ভিডিও দেখতে পাচ্ছেন!
কোডটি কীভাবে শিখবেন?
- Generator (yield): সাধারণ ফাংশনে
returnলিখলে ফাংশন ওখানেই শেষ হয়ে যায়। কিন্তুyieldব্যবহার করলে ফাংশনটি থামে না, সে একটি করে ফ্রেম দেয় এবং পরবর্তী ফ্রেমের জন্য অপেক্ষা করে। এভাবেই ভিডিও স্ট্রিমিং সম্ভব হয়। - multipart/x-mixed-replace: এটি ব্রাউজারের একটি চমৎকার প্রোটোকল। যখন এটি দেখে যে রেসপন্সের টাইপ
multipart, তখন সে বুঝতে পারে যে নতুন ফ্রেম আসলেই আগের ফ্রেমটিকে (ছবিটিকে) মুছে নতুনটি বসাতে হবে (Replace)। এটি এত দ্রুত হয় যে আমাদের কাছে ভিডিও মনে হয়! - Host 0.0.0.0: ফ্লাস্কে (Flask) ডিফল্টভাবে
127.0.0.1এ সার্ভার রান হয়, যা শুধু আপনার ল্যাপটপ থেকেই দেখা যায়। কিন্তু0.0.0.0দিলে এটি আপনার পুরো রাউটার বা নেটওয়ার্কের জন্য ওপেন হয়ে যায়।