FFmpeg: কীভাবে দক্ষতার সাথে ভিডিও বিভক্ত করবেন?


103

আমি একটি বৃহত এভিআই ভিডিও টানা দুটি আরও ছোট ভিডিওর মধ্যে ভাগ করতে চাই। আমি ffmpeg ব্যবহার করছি।

একটি উপায় হল ffmpeg দুইবার চালানো:

ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi

তবে ffmpeg এর মানচিত্র অনুসারে, আমি কেবলমাত্র একটি লাইন ব্যবহার করে একটি ইনপুট ফাইল থেকে একাধিক আউটপুট ফাইল তৈরি করতে পারি :

ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi \
   -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi

আমার প্রশ্ন হল, পরবর্তী পদ্ধতিটি গণনার সময় এবং স্মৃতি সংরক্ষণ করে?


3
"-vcodec copy -acodec copy" ব্যবহার করার সময় এটি খুব দ্রুত :))
সাভাস আদর

@ অ্যান্টনি, আপনি উভয় সংস্করণকে কেন সময় দিচ্ছেন না (এবং স্মৃতি মনিটরের দিকে তাকান htop) এবং উত্তরটি কী তা আমাদের জানান?
অ্যালকুবিয়েরেড্রাইভ

প্রথম উদাহরণটি এটি ক্রমানুসারে করে, যখন দ্বিতীয় উদাহরণটি থ্রেড ব্যবহার করে। উভয়ই একই কাজ করবে, কোনও লক্ষণীয় স্পিডআপ হওয়া উচিত নয়। তবে জিনিসগুলিকে সহজ করার জন্য, আপনি ffmpeg স্ট্রিম সেগমেন্টার ম্যাক্সার ব্যবহার করতে পারেন: ffmpeg.org/…
ম্লাদেন বি।

1
এই উদাহরণটি খারাপ দেখাচ্ছে! Ffmpeg ডকুমেন্টেশন -ss বিকল্প সম্পর্কে বলে: "যখন ইনপুট বিকল্প হিসাবে (-i) আগে ব্যবহৃত হয়, তখন এই ইনপুট ফাইলটিতে অবস্থানের সন্ধান করে When টাইমস্ট্যাম্পগুলি অবস্থানে পৌঁছে। " আপনি এটি আউটপুট অবস্থানে ব্যবহার করছেন, সুতরাং আপনার দ্বিতীয় লাইনটি প্রথম 30 মিনিটের ডিকোডিং এবং বাতিল করার প্রয়াসকে অপচয় করে।
লুসিয়ান উইশিক

1
@ লুসিয়ান উইশিক তবে -ssদ্বিতীয় বিভাজনে ইনপুট বিকল্প হিসাবে ব্যবহার করা সঠিক নাও হতে পারে, তাই আপনি একটি পরিষ্কার বিভাজন নাও পেতে পারেন। আইএমও ওপির উদাহরণটি আরও সঠিক।
jiggunjer

উত্তর:


82

"কীভাবে দক্ষতার সাথে ভিডিও বিভক্ত করবেন" এর প্রসঙ্গে ffmpeg উইকি এই পৃষ্ঠায় ফিরে আসে। আমি এই পৃষ্ঠাটির প্রশ্নের উত্তরটির বিষয়ে নিশ্চিত নই, তাই @ অ্যালকুবিয়েরেড্রাইভের পরামর্শ মতো আমি করেছি ...

echo "Two commands" 
time ffmpeg -v quiet -y -i input.ts -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 -sn test1.mkv
time ffmpeg -v quiet -y -i input.ts -vcodec copy -acodec copy -ss 00:30:00 -t 01:00:00 -sn test2.mkv
echo "One command" 
time ffmpeg -v quiet -y -i input.ts -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 \
  -sn test3.mkv -vcodec copy -acodec copy -ss 00:30:00 -t 01:00:00 -sn test4.mkv

কোন ফলাফল ...

Two commands
real    0m16.201s
user    0m1.830s
sys 0m1.301s

real    0m43.621s
user    0m4.943s
sys 0m2.908s

One command
real    0m59.410s
user    0m5.577s
sys 0m3.939s

কয়েক রান এবং অল্প গণিতের পরে আমি একটি এসডি ও এইচডি ফাইল পরীক্ষা করেছি।

Two commands SD 0m53.94 #2 wins  
One command  SD 0m49.63  

Two commands SD 0m55.00  
One command  SD 0m52.26 #1 wins 

Two commands SD 0m58.60 #2 wins  
One command  SD 0m58.61 

Two commands SD 0m54.60  
One command  SD 0m50.51 #1 wins 

Two commands SD 0m53.94  
One command  SD 0m49.63 #1 wins  

Two commands SD 0m55.00  
One command  SD 0m52.26 #1 wins 

Two commands SD 0m58.71  
One command  SD 0m58.61 #1 wins

Two commands SD 0m54.63  
One command  SD 0m50.51 #1 wins  

Two commands SD 1m6.67s #2 wins  
One command  SD 1m20.18  

Two commands SD 1m7.67  
One command  SD 1m6.72 #1 wins

Two commands SD 1m4.92  
One command  SD 1m2.24 #1 wins

Two commands SD 1m1.73  
One command  SD 0m59.72 #1 wins

Two commands HD 4m23.20  
One command  HD 3m40.02 #1 wins

Two commands SD 1m1.30  
One command  SD 0m59.59 #1 wins  

Two commands HD 3m47.89  
One command  HD 3m29.59 #1 wins  

Two commands SD 0m59.82  
One command  SD 0m59.41 #1 wins  

Two commands HD 3m51.18  
One command  HD 3m30.79 #1 wins  

এসডি ফাইল = 1.35 জিবি ডিভিবি পরিবহন প্রবাহ
এইচডি ফাইল = 3.14 জিবি ডিভিবি পরিবহন প্রবাহ

উপসংহার

আপনি যদি এইচডি পরিচালনা করছেন তবে একক কমান্ডটি আরও ভাল, এটি একটি 'ধীর সন্ধান' করতে ইনপুট ফাইলের পরে -ss ব্যবহার করার বিষয়ে ম্যানুয়াল মন্তব্যের সাথে একমত হয়। এসডি ফাইলগুলির একটি নগণ্য পার্থক্য রয়েছে।

দুটি দ্রুত কমান্ড সংস্করণটি আরও দ্রুত-হওয়া উচিত 'দ্রুত সন্ধান' এর জন্য ইনপুট ফাইলের আগে আরও সঠিক ধীরে ধীরে অনুসন্ধানের পরে ss


যদি টিএসে একাধিক প্রোগ্রাম থাকে (টিভি প্রোগ্রামগুলি যা ডিভিবি-টি দ্বারা ক্যাপচার করে) থাকে তবে কীভাবে এটি বিভক্ত করা যায়? উদাহরণস্বরূপ আমার কাছে একটি টিএস ফাইল রয়েছে যাতে ফুটবল + রান্না + কার্টুন রয়েছে i আমি কীভাবে এই টিএস ফাইলটি 3 এমপিজি ফাইলগুলিতে বিভক্ত করতে পারি?
ডাঃ জ্যাকি

আমি আমার প্রশ্নের উত্তরটি আপনার এখানে ব্যবহার করেছি ( স্ট্যাকওভারফ্লো.com / প্রশ্নস / ৪১৯83৮৯৪০ / )) তবে এটি কার্যকর হয়নি, আপনি কী ভাবেন যে আমি ভুল করছি?
utdev

1
ফলাফল ফাইলটি আমার ক্ষেত্রে কোনও ভিডিও (কেবল অডিও) সহ ছিল না। কিছু পরীক্ষা-নিরীক্ষার পরে আমি আত্মার সন্ধান পেয়েছি। এটির মতো "মানের সংশোধন করবেন না" এর জন্য কীটি নির্দিষ্ট করা দরকার -q:v 0
Oklas

19

এখানে একটি দরকারী স্ক্রিপ্ট, এটি আপনাকে স্বয়ংক্রিয়ভাবে বিভক্ত করতে সহায়তা করে: ffmpeg ব্যবহার করে ভিডিও বিভক্ত করার জন্য একটি স্ক্রিপ্ট

#!/bin/bash
 
# Written by Alexis Bezverkhyy <alexis@grapsus.net> in 2011
# This is free and unencumbered software released into the public domain.
# For more information, please refer to <http://unlicense.org/>
 
function usage {
        echo "Usage : ffsplit.sh input.file chunk-duration [output-filename-format]"
        echo -e "\t - input file may be any kind of file reconginzed by ffmpeg"
        echo -e "\t - chunk duration must be in seconds"
        echo -e "\t - output filename format must be printf-like, for example myvideo-part-%04d.avi"
        echo -e "\t - if no output filename format is given, it will be computed\
 automatically from input filename"
}
 
IN_FILE="$1"
OUT_FILE_FORMAT="$3"
typeset -i CHUNK_LEN
CHUNK_LEN="$2"
 
DURATION_HMS=$(ffmpeg -i "$IN_FILE" 2>&1 | grep Duration | cut -f 4 -d ' ')
DURATION_H=$(echo "$DURATION_HMS" | cut -d ':' -f 1)
DURATION_M=$(echo "$DURATION_HMS" | cut -d ':' -f 2)
DURATION_S=$(echo "$DURATION_HMS" | cut -d ':' -f 3 | cut -d '.' -f 1)
let "DURATION = ( DURATION_H * 60 + DURATION_M ) * 60 + DURATION_S"
 
if [ "$DURATION" = '0' ] ; then
        echo "Invalid input video"
        usage
        exit 1
fi
 
if [ "$CHUNK_LEN" = "0" ] ; then
        echo "Invalid chunk size"
        usage
        exit 2
fi
 
if [ -z "$OUT_FILE_FORMAT" ] ; then
        FILE_EXT=$(echo "$IN_FILE" | sed 's/^.*\.\([a-zA-Z0-9]\+\)$/\1/')
        FILE_NAME=$(echo "$IN_FILE" | sed 's/^\(.*\)\.[a-zA-Z0-9]\+$/\1/')
        OUT_FILE_FORMAT="${FILE_NAME}-%03d.${FILE_EXT}"
        echo "Using default output file format : $OUT_FILE_FORMAT"
fi
 
N='1'
OFFSET='0'
let 'N_FILES = DURATION / CHUNK_LEN + 1'
 
while [ "$OFFSET" -lt "$DURATION" ] ; do
        OUT_FILE=$(printf "$OUT_FILE_FORMAT" "$N")
        echo "writing $OUT_FILE ($N/$N_FILES)..."
        ffmpeg -i "$IN_FILE" -vcodec copy -acodec copy -ss "$OFFSET" -t "$CHUNK_LEN" "$OUT_FILE"
        let "N = N + 1"
        let "OFFSET = OFFSET + CHUNK_LEN"
done

2
সমুদ্র হিসাবে একই মন্তব্য আপনার জন্য যায়। যখন একেবারে প্রয়োজন হয় এবং যখন আপনার কাছে অন্য কোনও বিকল্প উপলব্ধ থাকে না তখন এটি ব্যাচ ফাইলগুলি লেখার জন্য দরকারী কারণ এটি বহনযোগ্য নয়। উদাহরণস্বরূপ, আপনি উইন্ডোজে একই স্ক্রিপ্টটি চালাতে সক্ষম হবেন না। যখন আরও জেনেরিক / বহনযোগ্য উপায় রয়েছে, ব্যাচ স্ক্রিপ্টগুলি এড়ানো উচিত, যাতে তাদের পোর্ট করার জন্য প্রয়োজনীয় সময় সাশ্রয় হয়। যেহেতু ffmpeg এর এই সমস্যাটি সমাধানের একাধিক উপায় রয়েছে, সঠিক উপায়টি হ'ল স্ক্রিপ্টগুলির সাহায্য ছাড়াই একা ffmpeg ব্যবহার করা।
ম্লাদেন বি।

দুর্দান্ত স্ক্রিপ্ট। তুমি কি এটা লিখেছ? এটা কি গিটহাবে? আমি কিছু পরামর্শ দিতে চাই :)
ভয়েস

এমপি 4 এর জন্য, দৃশ্যগুলি ক্ষতিগ্রস্থ হয়েছে। এর সাথে আরও ভালভাবে অনুলিপি প্রতিস্থাপন করুন: -vcodec libx264 -acodec
aac

8

আমার অভিজ্ঞতায় বিভাজন / যোগদানের জন্য ffmpeg ব্যবহার করবেন না। MP4Box, ffmpeg এর চেয়ে দ্রুত এবং হালকা। দয়া করে চেষ্টা করুন উদাহরণস্বরূপ, যদি আপনি একটি 1400mb এমপি 4 ফাইলটি 700 টি অংশে দুটি ভাগে বিভক্ত করতে চান তবে আপনি নীচের সিএমডিএল ব্যবহার করতে পারেন: MP4Box -splits 716800 input.mp4 উদাহরণস্বরূপ আপনি যে দুটি ফাইল ব্যবহার করতে পারেন তা সংযোগের জন্য:

MP4Box -cat file1.mp4 -cat file2.mp4 output.mp4

বা আপনার যদি সময়ের সাথে বিভাজনের প্রয়োজন হয় তবে ব্যবহার করুন -splitx StartTime:EndTime:

MP4Box -add input.mp4 -splitx 0:15 -new split.mp4


এটি আমার প্রয়োজন ঠিক ছিল! আমি যখন ffmpeg দিয়ে কাটছিলাম, তখন ক্লিপগুলি কীফ্রেমে শুরু হয়নি এবং শেষ প্রান্তে অদ্ভুত হিমশীতল ছিল। এমপি 4বক্স -স্প্লিটজ ব্যবহার করে কৌতুকটি করলেন!
ম্যাট

1
আমি একাধিক সংখ্যা সহ এমপি 4বক্স ব্যবহার করে ভিডিওটি কীভাবে ছাঁটাই করব? উদাহরণস্বরূপ আমার সেকেন্ডে সাব ক্লিপগুলি থাকা দরকার: 5 - 8, 21 - 30, 12 - 18 সুতরাং আমার তিনটি আউটপুট ভিডিও ফাইলের প্রয়োজন।
mhndev

এবং EndTimeতুলনায় ব্যবহার করা অনেক সহজ -t
vmassuchetto

6

http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with2020FFmpeg আপনার জন্য দরকারী হতে পারে। এছাড়াও ffmpeg এর সেগমেন্ট ম্যাক্সার রয়েছে যা কাজ করতে পারে।

যাইহোক আমার অনুমান যে তাদের একটি কমান্ডের সাথে সংযুক্ত করা সময় সাশ্রয় করতে পারে।


2

পরবর্তী পদ্ধতি গণনা সময় এবং স্মৃতি সংরক্ষণ করে?

আপনি যে দুটি উদাহরণ সরবরাহ করেছেন তার মধ্যে কোনও বড় পার্থক্য নেই। প্রথম উদাহরণটি 2 টি ধাপে ক্রমানুসারে ভিডিওটি কেটে দেয়, যখন দ্বিতীয় উদাহরণটি একই সময়ে এটি করে (থ্রেড ব্যবহার করে)। কোন বিশেষ গতি আপ লক্ষণীয় হবে না। আপনি এফএফম্পেগ দিয়ে একাধিক আউটপুট তৈরি সম্পর্কে আরও পড়তে পারেন

আরও, আপনি যা ব্যবহার করতে পারেন (সাম্প্রতিক এফএফপিপেতে ) হ'ল স্ট্রিম সেগমেন্টার ম্যাক্সার যা করতে পারে:

আউটপুট প্রায় নির্দিষ্ট সময়কালের পৃথক ফাইলের একটি সংখ্যা প্রবাহিত করে। আউটপুট ফাইলের নামটি চিত্র 2 এর অনুরূপ ফ্যাশনে সেট করা যেতে পারে ।


2

ইনকামিং ফাইলটিকে 50 ভাগে বিভক্ত করার জন্য এখানে একটি সাধারণ উইন্ডোজ ব্যাট ফাইল। প্রতিটি অংশ দৈর্ঘ্য 1 মিনিট। এই ধরনের বোবা স্ক্রিপ্টের জন্য দুঃখিত। আমি আশা করি এটি বোতাম উইন্ডোজ স্ক্রিপ্ট না থাকলে তার চেয়ে ভাল। সম্ভবত এটি কাউকে সাহায্য করে। (এই সাইট থেকে "লুপের জন্য ব্যাট ফাইলের উপর ভিত্তি করে))

set var=0
@echo off
:start
set lz=
if %var% EQU 50 goto end
if %var% LEQ 9 set lz=0
echo part %lz%%var%
ffmpeg -ss 00:%lz%%var%:00 -t 00:01:00 -i %1 -acodec copy -vcodec copy %2_%lz%%var%.mp4
set /a var+=1
goto start

:end
echo var has reached %var%.
exit

এটি প্রথমে প্রশ্নের প্রথম কোড স্নিপেট (ক্রমাগত ffmpegকমান্ড) একটি লুপ হিসাবে পুনর্লিখিত হয়। এই পদ্ধতির বা একটি একক আদেশ "গণনার সময় এবং স্মৃতি সংরক্ষণ করবে" কিনা এই প্রশ্নের উত্তর দেয় না।
বেকন

1

পরীক্ষামূলক পরীক্ষা হয়নি, তবে এটি আশাব্যঞ্জক মনে হচ্ছে:

বেসিক স্ট্রিম সেগমেন্টার

এটি স্পষ্টতই AVI কে একই আকারের অংশে বিভক্ত করছে, যা বোঝায় যে এই অংশগুলি looseিলে .ালা মানের নয় বা স্মৃতিশক্তি বাড়াবে না বা অবশ্যই পুনরায় গণনা করতে হবে।

এটি কোডেক অনুলিপিটিও ব্যবহার করে - এর অর্থ কি এটি খুব বড় স্ট্রিমগুলি পরিচালনা করতে পারে? কারণ এটি আমার সমস্যা, আমি আমার এভিটি ভেঙে ফেলতে চাই যাতে বিকৃতি থেকে মুক্তি পেতে কোনও ফিল্টার ব্যবহার করতে পারি। কিন্তু একটি পুরো এভিআই ঘন্টা কয়েক চালায়।


-1

ভিডিওটি বিভক্ত করার একটি সঠিক উপায়। আমি এটি আগে করেছি, এবং এটি আমার পক্ষে ভাল কাজ করছে।

ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4 (সেন্টিমিটারের জন্য)। shell_exec('ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4')(পিএইচপি জন্য)।

দয়া করে এটি অনুসরণ করুন এবং আমি নিশ্চিত এটি পুরোপুরি কার্যকর হবে।


কেন ভিডিওটি বিভক্ত করার এই "সঠিক উপায়"? প্রশ্নের কমান্ড লাইনের মতো, আপনি -iঅনুসরণ করছেন -ssএবং অনুসরণ করছেন -t। একই ইনপুট ফাইল থেকে কীভাবে একাধিক বিভাগকে দক্ষতার সাথে এক্সট্রাক্ট করা যায় তা সম্পর্কে প্রশ্নটি রয়েছে, যদিও আপনি কেবলমাত্র একটি একক বিভাগই বের করছেন। আমি দেখতে পাচ্ছি না কীভাবে এটি প্রশ্নের উত্তর দেয়।
বেকন

-2

একটি সহজ উপায় হ'ল পাবলিটো ইউআরএল-ভিত্তিক এপিআই সহ ট্রিম বিকল্প ব্যবহার করা ।

আপনি একবার আপনার ভিডিও আপলোড হয়ে গেলে, কেবল অফসেট শুরু করুন এবং ইউআরএল অফসেটে শেষ করুন (so_2, eo_2):

    https://media.publit.io/file/so_2,eo_2/tummy.mp4

এটি তৃতীয় দ্বিতীয় থেকে শুরু করে 2 সেকেন্ড দৈর্ঘ্যের সাথে সাথে নতুন ভিডিও তৈরি করবে। আপনি যেভাবে যাইহোক ভিডিওগুলি ভাগ করতে পারেন।


প্রশ্ন জিজ্ঞাসা করা হয়, যা দিয়ে এক ইনপুট ফাইল থেকে একাধিক অংশ আহরণের দুটি পন্থা অধিক দক্ষ হয় ffmpeg। আপনার সত্যিকারের, সত্যই দ্রুত ইন্টারনেট সংযোগ না থাকলে, আমি মনে করি পুরো ভিডিওটি একটি ক্লাউড পরিষেবাদিতে আপলোড করতে হবে এবং তারপরে ফলাফলগুলি ডাউনলোড করা প্রক্রিয়াকরণের সময়টিকে উল্লেখযোগ্যভাবে বাড়িয়ে তুলবে। তবুও, কোন পদ্ধতির সাহায্যেffmpeg আরও দক্ষ তা এই প্রশ্নের এখনও উত্তর দেয় না ।
বেকন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.