वीडियो को काटने के लिए ffmpeg का उपयोग करना


333

मैं ffmpeg का उपयोग इस तरह से एक बड़ी फ़ाइल के एक सेक्शन को काटने के लिए कर रहा हूँ:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

-ssहिस्सा ठीक काम करता है, लेकिन -tध्यान नहीं दिया जाता। यह निर्दिष्ट निर्दिष्ट सेकंड को सही ढंग से हटाता है, -ssलेकिन फिर प्रतिलिपि के साथ इनपुट के अंत तक जाता रहता है।

वहाँ एक वीडियो का अंत करने के लिए इसे फिर से भरना बिना ffmpeg का उपयोग करने का एक तरीका है?


1
यह वाक्यविन्यास सही है।
जिगगंजर

जवाबों:


393

आप -ssप्रारंभ टाइमस्टैम्प निर्दिष्ट करने के लिए विकल्प का उपयोग कर सकते हैं , और -tएन्कोडिंग अवधि निर्दिष्ट करने के लिए विकल्प। टाइमस्टैम्प को HH:MM:SS.xxxप्रारूप या सेकंड ( s.msec) में होना चाहिए ।

निम्नलिखित पहले 30 सेकंड क्लिप होगा, और फिर सब कुछ है कि उसके बाद 10 सेकंड क्लिप है:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

ध्यान दें कि -tएक आउटपुट विकल्प है और हमेशा के बाद निर्दिष्ट करने की आवश्यकता होती है -i

कुछ सुझाव:

  • पुराने ffmpeg संस्करणों के लिए, यदि आप -ssबाद में उपयोग करते हैं, तो आप -iपूरी तरह से धीमी गति से निष्पादन की कीमत पर अधिक सटीक खोज प्राप्त करते हैं। इसे भी देखें: FFmpeg के साथ तलाश
  • आप टाइमस्टैम्प को निर्दिष्ट -toकरने के -tलिए उपयोग कर सकते हैं जिसके लिए आप कटौती करना चाहते हैं। तो, -i <input> -ss 30 -t 10आप के बजाय -i <input> -ss 30 -to 40एक ही चीज को प्राप्त करने के लिए भी कर सकते हैं ।

  • यदि आपका ffmpeg समर्थन नहीं करता है -c, या -to, इसकी संभावना बहुत पुरानी है। स्वयं एक नया संस्करण संकलित करें या उनके होमपेज से एक स्थिर बिल्ड डाउनलोड करें । यह वास्तव में जटिल नहीं है।


1
@ मॉन्डेन दरअसल, आपको टॉस डालने के बाद अधिक सटीकता मिलती है। और slhck में इसका उल्लेख यहां किया गया है। blog.superuser.com/2012/02/24/… ffmpeg प्रलेखन में -ss के लिए इसे पहले या बाद में लगाने के बीच अंतर का उल्लेख है।
बार्लोप

5
+1 मैं पहले 35 सेकंड के बाद सब कुछ अनदेखा करने का तरीका जानने के लिए यहाँ आया, धन्यवाद:ffmpeg -i input.wmv -c copy -t 35 output.wmv
karlphillip

2
यह मेरे (mp4) लिए काम नहीं करता है। : यह सिर्फ एक 5 सेकंड काली स्क्रीन का उत्पादनframe= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s
clocksmith

2
यह मेरे वीडियो क्लिप की शुरुआत में 3-4 एस काली स्क्रीन का उत्पादन किया। -c copyप्रारंभिक ब्लैक स्क्रीन को हटाने के साथ क्रिस के संशोधन ने विवरण के लिए उसका उत्तर देखें।
joelostblom

4
आप लिखते हैं "निम्नलिखित पहले 30 सेकंड क्लिप होगा, और फिर सब कुछ है कि 10 सेकंड के बाद क्लिप है:" <- इसका क्या मतलब है? क्लिप से क्या आपका मतलब है? 'कॉस क्लिप का मतलब क्लिप आउट हो सकता है। मान लें कि आप शामिल हैं। क्या आपका मतलब है कि 30 सेकंड से शुरू करें, और वहां से सिर्फ 10 सेकंड शामिल करें? यदि ऐसा है तो मेरा सुझाव है कि आप लिखें कि यह बहुत स्पष्ट होगा।
बार्लॉप

94

जैसा कि अन्य लोगों ने उल्लेख किया है, -ssपहले (बहुत तेज) या बाद में (अधिक सटीक) डालने से -iबड़ा अंतर पड़ता है। Ffmpeg की तलाश पृष्ठ पर "फास्ट एंड एक्यूरेट सीकिंग" अनुभाग आपको बताता है कि दोनों कैसे प्राप्त करें, और मैंने इसका उपयोग किया है, और यह एक बड़ा अंतर बनाता है। मूल रूप से आप -ssपहले और बाद में डालते हैं -i, बस यह सुनिश्चित करने के लिए पर्याप्त समय छोड़ देते हैं कि आप एक और कुंजी फ्रेम करने के लिए कहां से काटना शुरू करना चाहते हैं। उदाहरण: यदि आप 1 मिनट की क्लिप बनाना चाहते हैं, तो 9min0sec से 10min 0sec तक Video.mp4 में, आप इसे जल्दी और सही तरीके से उपयोग कर सकते हैं:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

पहले -ssतेजी से (लगभग) 8min0sec -ssचाहता है , और फिर दूसरा 9min0sec को सटीक रूप से ढूंढता है, और -t 00:01:001min0sec क्लिप निकालता है।

उस पृष्ठ से इस महत्वपूर्ण बिंदु पर भी ध्यान दें: "यदि आप उपयोग -ssकरते हैं -c:v copy, तो परिणामस्वरूप बिटस्ट्रीम समाप्त हो सकता है, ऑडियो स्ट्रीम के साथ चंचल नहीं, या सिंक से बाहर हो सकता है, क्योंकि ffmpeg केवल i- फ्रेम पर उपयोग / विभाजन के लिए मजबूर है। "

इसका मतलब है कि आपको वीडियो को फिर से एनकोड करना होगा, भले ही आप इसे कॉपी करना चाहते हों, या इसे तड़का हुआ और सिंक से बाहर होने का खतरा हो। आप बस -c copyपहले कोशिश कर सकते हैं , लेकिन अगर वीडियो बेकार है तो आपको इसे फिर से करने की आवश्यकता होगी।


-c:a copyइस तरह की मांग के लिए एक ही चेतावनी लागू होती है ।
जिग्गंजर

1
सबसे अच्छा जवाब, इस तरह से मेरे लिए सबसे अच्छा काम किया।
ओन्ड्रा kaइस्का

3
ऐसा लगता है कि "-सी" अब दो बार निर्दिष्ट किए बिना ffmpeg 2.1+ में तेज और सटीक है। trac.ffmpeg.org/wiki/Seeking
कॉनरेड मेयर

25

मैंने पाया कि शुरुआत में आधे सेकंड की काट -ssके साथ संयुक्त -c copy

उससे बचने के लिए, आपको -c copy(जो कि वास्तव में ट्रांसकोड करेगा) को हटाना होगा।


4
एक और जवाब है जो सटीकता के साथ व्यवहार करता है। डिफ़ॉल्ट विकल्प के साथ पुन: एन्कोडिंग अक्सर वह नहीं होता है जो आप करना चाहते हैं!
टॉमस गैंडर

अच्छी बात @TomaszGandor
क्रिस

1
मुझे @ TomaszGandor का जवाब बिल्कुल समझ में नहीं आया, लेकिन -c copyइसे हटा दिया गया।
इयूलियन ओनोफ्रेई

14

मैन्युअल

फाइल को एक मीडिया प्लेयर में खोलें, जो फ्रेम एडवांस द्वारा फ्रेम करेगा और डेटा के साथ एक AVISynth फाइल प्ले करेगा जैसे:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

फिर EXACT समय प्रारूप में कटौती करें:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

तथा

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

अब सामग्री के साथ वीडियो फ़ाइलों के साथ एक txt फ़ाइल बनाएं:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Ffmpeg चलाएं:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"

9

मेरे लिए -tविकल्प काम नहीं किया, लेकिन -vframesकाम किया। मैं उपयोग करना पसंद करता हूं #frames, क्योंकि मैं आई-फ्रेम्स में कटौती करूंगा और मुझे वीडियो का उपयोग करने के लिए जीओपी का पता चला ffprobe

मेरे लिए काम करने वाली कमांड लाइन है:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

वैसे, निष्पादन के समय में -ssसामने रखने -iसे बहुत फर्क पड़ता है।


1
वास्तव में -vframes(या -frames:v) के बाद आना चाहिए -iक्योंकि यह एक आउटपुट विकल्प है।
slhck

5

User225366 के साथ, -t विकल्प लघु वीडियो के लिए काम नहीं करता है, लेकिन यह लंबे वीडियो के लिए करता है। छोटे वीडियो के लिए ऐसा लगता है कि -फ्रेम: वी बेहतर है। इसी से मेरा काम बना है।

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

अगर वीडियो में ऑडियो है, तो अन्य जवाबों के रूप में -ओकोडेक कॉपी को जोड़ना होगा।


0

मैं यह नहीं कहता कि कई लोग इसका उल्लेख करते हैं (मैं कोई विशेषज्ञ नहीं हूं इसलिए शायद कोई पकड़ हो), लेकिन अगर आपकी फ़ाइल में उपशीर्षक और अन्य मेटाडेटा जैसे अध्याय और इसी तरह की अन्य धाराएं हैं, तो कटौती / ट्रिम करना और सभी धाराओं को रखना संभव है निम्नलिखित आदेश

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

साथ -map 0आप फ़ाइल में सभी धाराओं लेते हैं, और साथ -c copyआप सभी उन्हें कॉपी वे कर रहे हैं के रूप में। प्रारंभ को छोड़ने के माध्यम से
प्रयोग -toकरने से -ssइनपुट वीडियो शुरू से दूसरे 60 तक कट जाएगा।

mapयदि आप केवल विशिष्ट धाराओं को कट में रखना चाहते हैं, तो फ़िडलिंग उपयोगी है (हो सकता है कि आपको फ़ाइल में सभी ऑडियो स्रोतों की आवश्यकता न हो, या केवल कुछ उपशीर्षक)।

मैं इसका उपयोग तब करता हूं जब मुझे बड़ी MKV फ़ाइलों को विभाजित करने की आवश्यकता होती है जिन्हें FAT32 स्टोरेज में संग्रहीत नहीं किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.