টাইমস্ট্যাম্পগুলির তথ্যের সাথে ffmpeg ব্যবহার করে আমি কীভাবে ভিডিও থেকে নিষ্কাশন করতে পারি


2

আমি ffmpeg ব্যবহার করে ফ্রেমটি বের করতে এবং jpg ফাইলগুলিতে নিম্নলিখিত হিসাবে সংরক্ষণ করতে পারি।

ffmpeg -i video.avi -r 1 -f image2 -q 1 %05d.jpg

তবে আমি কীভাবে প্রতিটি উত্তোলিত ফ্রেমের টাইমস্ট্যাম্পগুলির তথ্য পেতে পারি। উদাহরণস্বরূপ, আমি hh_mm_ss.jpg হিসাবে ফাইলের নাম সহ jpg ফাইলটি সংরক্ষণ করতে চাই?


স্ট্যাক ওভারফ্লোতে জিজ্ঞাসা করা এই প্রশ্নটি একবার দেখুন । গৃহীত উত্তরটি ইমেজম্যাগিক ব্যবহার করে একটি পরিশ্রম সরবরাহ করে, কারণ এফএফম্পেগ নিজে থেকে এটি করতে সক্ষম হয় না।
নিক ভ্যান টিলবর্গ

@ নিকভান টিলবার্গ আমি মনে করি যে ভিডিওটি ভিডিওর (পিটিএস, উপস্থাপনার সময় স্ট্যাম্প) থেকে নেওয়া টাইমস্ট্যাম্পের জন্য প্রশ্ন করছে - সুতরাং ভিডিওর জন্য 1 মিনিট 30 সেকেন্ড থেকে নেওয়া একটি ফ্রেমের ফাইলের নাম থাকতে হবে 00_01_30.jpg- সিস্টেম টাইমস্ট্যাম্পের পরিবর্তে যা ফাইল তৈরি করা হয়েছিল।
27s13

আহ ঠিক আছে, তবে একটি সাধারণ নাম পরিবর্তনের স্ক্রিপ্টটি কৌশলটি করা উচিত। @ মিনসুন, আপনি কি চান তা নিশ্চিত করতে পারেন?
নিক ভ্যান টিলবর্গ

চিত্র 00_20_00.jpg: আমি একই প্রশ্ন, আমি বিশেষভাবে কি বিশ্বাস তিনি জিজ্ঞেস করছেন (যেমন আমি), ভিডিও থেকে টাইমস্ট্যাম্প জন্য অর্থাত একটি ফ্রেম ভিডিওতে 20 সেকেন্ডের নেয়া সঙ্গে একটি ফাইলের নাম হবে আছে
davidparks21

উত্তর:


1

ভাল, দেখে মনে হচ্ছে ffmpeg এটি পরিচালনা করতে পারে না (বা ভিএলসি মিডিয়া প্লেয়ারের মতো অন্যান্য জনপ্রিয় সমাধানগুলিও করতে পারে না)। আমি ব্যবহৃত একটি কার্যকর সমাধানটি হ'ল ভিডিওর সময়কাল পাওয়া ffmpeg -i video_file.mp4এবং ফ্রেমের সংখ্যার সাথে ভাগ করে নেওয়া।

রেফারেন্স এবং উদাহরণের জন্য এখানে একটি বাশ স্ক্রিপ্ট আমি লিখেছি যে ব্যাচ ভিডিওগুলির একটি সেট প্রক্রিয়া করে, তাদের ফ্রেমে বিভক্ত করে (@ 30 এফপিএস) এবং ফাইলগুলির নাম পরিবর্তন করে যাতে তাদের উভয় ভিডিও টাইমস্ট্যাম্প থাকে (ভিডিওর শুরু থেকে মিলিসেকেন্ডে) এবং ফ্রেম নম্বর মূলত।

আমি নিশ্চিত যে স্ক্রিপ্টটি আরও দক্ষ হতে পারে তবে এটি আমার উদ্দেশ্যগুলির জন্য যথেষ্ট ভাল কাজ করে, তাই আশা করি এটি ব্যবহারটি খুঁজে পাবে (যেহেতু এই প্রশ্নটি গুগল অনুসন্ধানে উঠে আসছে):

# Regular expression definitions to get frame number, and to get video duration from ffmpeg -i
FRAME_REGEX="frame-([0-9]*)\.jpeg"
LEN_REGEX="Duration: ([0-9]*):([0-9]*):([0-9]*)\.([0-9]*), start"

# Loops through the files passed in command line arguments, 
# example: videotoframes video-*.mp4
#      or: videotoframes file1.mp4 file2.mp4 file3.mp4
for vf in "$@"; do
    video_info=$(ffmpeg -i $vf 2>&1)                                                                                                                        # Get the video info as a string from ffmpeg -i
    [[ $video_info =~ $LEN_REGEX ]]                                                                                                                         # Extract length using reges; Groups 1=hr; 2=min; 3=sec; 4=sec(decimal fraction)
    LENGTH_MS=$(bc <<< "scale=2; ${BASH_REMATCH[1]} * 3600000 + ${BASH_REMATCH[2]} * 60000 + ${BASH_REMATCH[3]} * 1000 + ${BASH_REMATCH[4]} * 10")          # Calculate length of video in MS from above regex extraction

    mkdir frames-$vf                                                # Make a directory for the frames (same as the video file prefixed with "frames-"
    ffmpeg -i $vf -r 30 -f image2 frames-$vf/frame-%05d.jpeg        # Convert the video file to frames using ffmpeg, -r = 30 fps
    FRAMES=$(ls -1 frames-$vf | wc -l)                              # Get the total number of frames produced by the video (used to extrapolate the timestamp of the frame in a few lines)

    # Loop through the frames, generate a timestamp in milliseconds, and rename the files
    for f in frames-$vf/frame-*; do
        [[ $f =~ $FRAME_REGEX ]]                                                        # Regex to grab the frame number for each file
        timestamp=$(bc <<< "scale=0; $LENGTH_MS/$FRAMES*${BASH_REMATCH[1]}")            # Calculate the timestamp (length_of_video / total_frames_generated * files_frame_number)
        `printf "mv $f frames-$vf/time-%07d-%s" $timestamp $(basename $f)`              # Execute a mv (move) command, uses the `printf ...` (execute command returned by printf) syntax to zero-pad the timestamp in the file name
    done;
done;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.