AI एजेंट · पाठ

एजेंट में वीडियो की समझ

फ़्रेम निष्कर्षण, वीडियो सारांश और क्लिप पर समय-आधारित तर्क।

पाठ 3, कुल 4 में से13 चरण

एजेंट में वीडियो की समझ, CoddyKit पर AI एजेंट का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह AI एजेंट सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। AI एजेंट पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

एजेंट के लिए वीडियो की समझ

अधिकांश LLM सीधे वीडियो फ़ाइलों को संसाधित नहीं कर सकते, लेकिन एजेंट प्रतिनिधि फ़्रेम निकालकर और उन्हें छवियों के रूप में भेजकर वीडियो का विश्लेषण कर सकते हैं। इसके बाद एजेंट घटनाओं, परिवर्तनों और समय के साथ बनने वाले पैटर्न का पता लगाने के लिए दृश्य क्रम पर तर्क करता है।

फ़्रेम निकालने के लिए OpenCV स्थापित करना

OpenCV (cv2) पाइथन में वीडियो प्रसंस्करण की मानक लाइब्रेरी है। इसकी सहायता से आप वीडियो फ़ाइलें खोल सकते हैं, उनका मेटाडेटा (फ़्रेम दर, रिज़ॉल्यूशन, फ़्रेम की संख्या) पढ़ सकते हैं और अलग-अलग फ़्रेम को NumPy सरणियों के रूप में निकाल सकते हैं।

# pip install opencv-python-headless
import cv2

def get_video_metadata(video_path: str) -> dict:
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        raise IOError(f'Cannot open video: {video_path}')

    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    duration_s = frame_count / fps if fps > 0 else 0
    cap.release()

    return {
        'fps': round(fps, 2),
        'frame_count': frame_count,
        'width': width,
        'height': height,
        'duration_seconds': round(duration_s, 2)
    }

meta = get_video_metadata('recording.mp4')
print(meta)

हर N सेकंड में फ़्रेम निकालना

अधिकांश वीडियो-समझ कार्यों के लिए आपको हर फ़्रेम की आवश्यकता नहीं होती। हर N सेकंड में एक फ़्रेम का नमूना लेने से वीडियो की सामग्री का प्रतिनिधि सारांश मिल जाता है। 1 फ़्रेम प्रति सेकंड की दर से 60 सेकंड के वीडियो से 60 फ़्रेम बनते हैं।

import cv2
import os

def extract_frames(
    video_path: str,
    output_dir: str,
    every_n_seconds: float = 5.0
) -> list:
    cap = cv2.VideoCapture(video_path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_interval = int(fps * every_n_seconds)
    os.makedirs(output_dir, exist_ok=True)

    saved_frames = []
    frame_idx = 0
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        if frame_idx % frame_interval == 0:
            timestamp = round(frame_idx / fps, 2)
            fname = f'{output_dir}/frame_{frame_idx:06d}_{timestamp}s.jpg'
            cv2.imwrite(fname, frame)
            saved_frames.append({'path': fname, 'timestamp': timestamp})
        frame_idx += 1

    cap.release()
    print(f'Extracted {len(saved_frames)} frames')
    return saved_frames

दृश्य-परिवर्तन का पता लगाना

समान अंतराल पर नमूने लेने के बजाय, दृश्य सीमाओं पर फ़्रेम निकालें—अर्थात् उन क्षणों पर जब दृश्य सामग्री में महत्वपूर्ण बदलाव होता है। इससे प्रत्येक एपीआई अनुरोध में अधिक उपयोगी फ़्रेम मिलते हैं। फ़्रेमों का अंतर निकालें: यदि लगातार फ़्रेमों के बीच का माध्य निरपेक्ष अंतर किसी सीमा से अधिक हो, तो दृश्य-परिवर्तन हुआ है।

import cv2
import numpy as np

def extract_scene_change_frames(
    video_path: str,
    output_dir: str,
    diff_threshold: float = 30.0
) -> list:
    cap = cv2.VideoCapture(video_path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    os.makedirs(output_dir, exist_ok=True)
    prev_gray = None
    saved = []
    frame_idx = 0

    while True:
        ret, frame = cap.read()
        if not ret:
            break
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        if prev_gray is not None:
            diff = np.mean(np.abs(gray.astype(float) - prev_gray.astype(float)))
            if diff > diff_threshold:
                ts = round(frame_idx / fps, 2)
                fname = f'{output_dir}/scene_{frame_idx:06d}_{ts}s.jpg'
                cv2.imwrite(fname, frame)
                saved.append({'path': fname, 'timestamp': ts, 'diff': round(diff, 2)})
        prev_gray = gray
        frame_idx += 1

    cap.release()
    return saved

फ़्रेम क्रम को विज़न एपीआई पर भेजना

निकाले गए कई फ़्रेमों को एक ही संदेश में विज़न एपीआई पर भेजें। प्रत्येक फ़्रेम का समय-चिह्न शामिल करें, ताकि मॉडल कालानुक्रमिक क्रम और अवधि के बारे में तर्क कर सके। अपने प्रॉम्प्ट में स्पष्ट रूप से समय-संबंधी तर्क करने के लिए कहें।

import base64
import anthropic

def describe_video_frames(frame_info_list: list, query: str) -> str:
    client = anthropic.Anthropic(api_key='YOUR_API_KEY')
    content = []
    for fi in frame_info_list:
        with open(fi['path'], 'rb') as f:
            b64 = base64.standard_b64encode(f.read()).decode('utf-8')
        content.append({
            'type': 'text',
            'text': f'Frame at {fi["timestamp"]}s:'
        })
        content.append({
            'type': 'image',
            'source': {'type': 'base64', 'media_type': 'image/jpeg', 'data': b64}
        })
    content.append({'type': 'text', 'text': query})

    response = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=1024,
        messages=[{'role': 'user', 'content': content}]
    )
    return response.content[0].text

समय-संबंधी तर्क वाले प्रॉम्प्ट

समय-संबंधी तर्क के लिए प्रॉम्प्ट को विशेष रूप से तैयार करना आवश्यक है। मॉडल से फ़्रेमों की स्पष्ट रूप से तुलना करने, क्या बदला यह बताने, गतिविधियों की अवधि का अनुमान लगाने और फ़्रेमों के बीच कारण-संबंध पहचानने के लिए कहें।

TEMPORAL_QUERY = (
    'You are analysing a video sequence. The frames above are in chronological order '
    'with their timestamps shown. Please:\n'
    '1. Describe what changed between the first and last frame\n'
    '2. Identify any notable events and when they occurred (timestamp)\n'
    '3. Summarise the overall activity shown in the video\n'
    '4. Estimate the total duration of the main activity\n'
    'Be specific about timestamps.'
)

# More targeted temporal query:
CHANGE_DETECTION_QUERY = (
    'Compare frame at {start_ts}s and frame at {end_ts}s. '
    'List all visible differences in bullet points. '
    'Categorise each change as: object_moved, object_added, '
    'object_removed, lighting_change, or camera_move.'
)

# Usage:
query = CHANGE_DETECTION_QUERY.format(start_ts=0.0, end_ts=20.0)

if __name__ == '__main__':
    print('Temporal reasoning query:')
    print(TEMPORAL_QUERY)
    print()
    print('Change detection query:')
    print(query)

वीडियो सारांश कार्यप्रवाह

वीडियो सारांश का पूरा कार्यप्रवाह है: फ़्रेम निकालें → उन्हें समूहों में विज़न मॉडल को भेजें → प्रत्येक समूह के सारांश एकत्र करें → अंतिम सारांश तैयार करें। समूह बनाने से संदर्भ विंडो की सीमा पार होने से बचा जा सकता है।

def summarise_video(
    video_path: str,
    every_n_seconds: float = 10.0,
    batch_size: int = 5
) -> str:
    import anthropic
    client = anthropic.Anthropic(api_key='YOUR_API_KEY')

    # Extract frames
    frames = extract_frames(video_path, '/tmp/video_frames', every_n_seconds)

    # Process in batches
    batch_summaries = []
    for i in range(0, len(frames), batch_size):
        batch = frames[i:i + batch_size]
        ts_range = f'{batch[0]["timestamp"]}s - {batch[-1]["timestamp"]}s'
        query = f'Summarise what happens in this video segment ({ts_range}).'
        summary = describe_video_frames(batch, query)
        batch_summaries.append(f'[{ts_range}] {summary}')

    # Synthesise
    all_summaries = '\n\n'.join(batch_summaries)
    result = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=512,
        messages=[{'role': 'user', 'content':
            f'Here are segment-level video summaries:\n\n{all_summaries}\n\n'
            'Write a single coherent summary of the entire video.'
        }]
    )
    return result.content[0].text

फ़्रेमों में ऑब्जेक्ट ट्रैक करना

विज़न मॉडल से फ़्रेमों के क्रम में किसी विशेष ऑब्जेक्ट को ट्रैक करने के लिए कहें। उदाहरण के लिए: 'प्रत्येक फ़्रेम में लाल कार की स्थिति बताएँ: ऊपर-बाएँ, ऊपर-दाएँ, मध्य, नीचे-बाएँ, नीचे-दाएँ।' इससे कंप्यूटर विज़न ट्रैकिंग एल्गोरिदम के बिना मोटे तौर पर गति-पथ बनाया जा सकता है।

def track_object_across_frames(
    frames: list,
    object_description: str
) -> list:
    import anthropic, base64
    client = anthropic.Anthropic(api_key='YOUR_API_KEY')
    trajectory = []

    for fi in frames:
        with open(fi['path'], 'rb') as f:
            b64 = base64.standard_b64encode(f.read()).decode('utf-8')
        response = client.messages.create(
            model='claude-opus-4-5',
            max_tokens=128,
            messages=[{
                'role': 'user',
                'content': [
                    {'type': 'image', 'source': {'type': 'base64',
                      'media_type': 'image/jpeg', 'data': b64}},
                    {'type': 'text', 'text':
                      f'Where is the {object_description} in this frame? '
                      'Answer with one of: top-left, top-right, centre, '
                      'bottom-left, bottom-right, not-visible.'}
                ]
            }]
        )
        trajectory.append({
            'timestamp': fi['timestamp'],
            'position': response.content[0].text.strip()
        })
    return trajectory

फ़्रेमों की संख्या की सीमाओं का प्रबंधन

विज़न एपीआई की संदर्भ विंडो में एक अनुरोध के साथ भेजी जा सकने वाली छवियों की संख्या की सीमा होती है (आमतौर पर 5–20 छवियाँ)। लंबे वीडियो के लिए पदानुक्रमित तरीका अपनाएँ: खंडों का स्वतंत्र रूप से विश्लेषण करें, फिर दूसरे LLM अनुरोध की सहायता से खंड-सारांशों को मिलाकर अंतिम सारांश बनाएँ।

MAX_FRAMES_PER_REQUEST = 8

def hierarchical_video_analysis(frames: list, final_query: str) -> str:
    import anthropic
    client = anthropic.Anthropic(api_key='YOUR_API_KEY')

    # Level 1: analyse each chunk
    chunk_summaries = []
    for i in range(0, len(frames), MAX_FRAMES_PER_REQUEST):
        chunk = frames[i:i + MAX_FRAMES_PER_REQUEST]
        ts = f'{chunk[0]["timestamp"]}s-{chunk[-1]["timestamp"]}s'
        summary = describe_video_frames(
            chunk, f'What happens in this segment ({ts})?'
        )
        chunk_summaries.append(f'Segment {ts}: {summary}')

    # Level 2: synthesise all chunk summaries
    combined = '\n'.join(chunk_summaries)
    result = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=512,
        messages=[{
            'role': 'user',
            'content': f'Video segments:\n{combined}\n\n{final_query}'
        }]
    )
    return result.content[0].text

ऑडियो और वीडियो विश्लेषण को मिलाना

सबसे व्यापक समझ के लिए फ़्रेम-स्तरीय दृश्य विश्लेषण को Whisper के ऑडियो प्रतिलेखन के साथ मिलाएँ। एजेंट प्रत्येक समय-चिह्न पर जो दिखाई देता है और जो कहा जाता है उनका संबंध जोड़ सकता है, जिससे बैठक विश्लेषण या ट्यूटोरियल अनुक्रमण जैसे प्रभावी कार्य संभव होते हैं।

def full_video_analysis(video_path: str) -> dict:
    import subprocess

    # Step 1: Extract audio track
    audio_path = '/tmp/video_audio.mp3'
    subprocess.run([
        'ffmpeg', '-i', video_path, '-q:a', '0', '-map', 'a',
        audio_path, '-y'
    ], capture_output=True)

    # Step 2: Transcribe audio
    transcript_data = transcribe_with_timestamps(audio_path)

    # Step 3: Extract key frames
    frames = extract_frames(video_path, '/tmp/key_frames', every_n_seconds=15.0)

    # Step 4: Visual summary
    visual_summary = hierarchical_video_analysis(
        frames, 'Summarise the visual content.'
    )

    return {
        'transcript': transcript_data['full_text'],
        'transcript_segments': transcript_data['segments'],
        'visual_summary': visual_summary,
        'frame_count': len(frames)
    }

सफ़ाई और फ़्रेम प्रबंधन

निकाले गए फ़्रेम तेज़ी से जमा हो सकते हैं। प्रसंस्करण के बाद अस्थायी फ़्रेम फ़ाइलों को हमेशा साफ़ करें। समान वीडियो के बार-बार किए जाने वाले विश्लेषण में दोबारा फ़्रेम निकालने से बचने के लिए (video_path, frame_rate) हैश पर आधारित फ़्रेम कैश लागू करें।

import os
import shutil
import hashlib

FRAME_CACHE_DIR = '/tmp/frame_cache'

def get_cache_key(video_path: str, every_n_seconds: float) -> str:
    content = f'{video_path}:{every_n_seconds}'
    return hashlib.md5(content.encode()).hexdigest()[:12]

def get_or_extract_frames(video_path: str, every_n_seconds: float) -> list:
    key = get_cache_key(video_path, every_n_seconds)
    cache_dir = os.path.join(FRAME_CACHE_DIR, key)

    if os.path.exists(cache_dir):
        print(f'Cache hit: {key}')
        files = sorted(os.listdir(cache_dir))
        return [
            {'path': os.path.join(cache_dir, f),
             'timestamp': float(f.split('_')[-1].replace('s.jpg', ''))}
            for f in files if f.endswith('.jpg')
        ]
    return extract_frames(video_path, cache_dir, every_n_seconds)

def clear_frame_cache():
    if os.path.exists(FRAME_CACHE_DIR):
        shutil.rmtree(FRAME_CACHE_DIR)
        print('Frame cache cleared')

ज्ञान-जाँच

वीडियो विश्लेषण के लिए समान अंतराल पर फ़्रेमों का नमूना लेने की तुलना में दृश्य-परिवर्तन का पता लगाना बेहतर क्यों है?

पुनरावलोकन: एजेंट में वीडियो की समझ

बहुत अच्छा कार्य! इस पाठ की मुख्य बातें:

  • OpenCV: cap.read() से फ़्रेम निकालें; हर N सेकंड पर या दृश्य-परिवर्तन के समय नमूना लें
  • फ़्रेम क्रम: समय-संबंधी संदर्भ के लिए समय-चिह्नों सहित कालानुक्रमिक क्रम में भेजें
  • पदानुक्रमित विश्लेषण: समूहों में बाँटें → खंड-सारांश बनाएँ → अंतिम संश्लेषण करें
  • संयुक्त विश्लेषण: ffmpeg ऑडियो निकालता है; Whisper प्रतिलेखन करता है; दृश्य फ़्रेमों से परस्पर मिलान करें
  • फ़्रेम कैश: हैश-कुंजी आधारित कैश निर्देशिका से अनावश्यक निष्कर्षण से बचें

अगला विषय: बहु-माध्यमीय तर्क—जब पाठ कुछ और कहता है और छवि कुछ और दिखाती है।

शुरुआत निःशुल्क

एआई शिक्षक के साथ AI एजेंट सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
60
पाठ
239

अक्सर पूछे जाने वाले प्रश्न

क्या “एजेंट में वीडियो की समझ” पाठ निःशुल्क है?

हाँ—“एजेंट में वीडियो की समझ” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और AI एजेंट पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। AI एजेंट पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“एजेंट में वीडियो की समझ” में मैं क्या सीखूँगा?

फ़्रेम निष्कर्षण, वीडियो सारांश और क्लिप पर समय-आधारित तर्क। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ AI एजेंट का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या AI एजेंट शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर AI एजेंट शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“एजेंट में वीडियो की समझ” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस AI एजेंट पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर AI एजेंट पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Claude Vision और GPT-4V से इमेज + टेक्स्ट एजेंट
  2. ऑडियो + टेक्स्ट एजेंट कार्यप्रवाह
  3. एजेंट में वीडियो की समझ
  4. क्रॉस-मोडल तर्क पैटर्न
← AI एजेंट पर वापस जाएँ