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


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

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

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

वीडियो के अंत को बिना किसी रिकॉर्ड किए कटौती करने के लिए ffmpeg का उपयोग करने का कोई तरीका है?


265
2018-05-06 14:12


मूल


यह वाक्यविन्यास सही है। - jiggunjer
stackoverflow.com/questions/18444194/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


जवाब:


आप इसका उपयोग कर सकते हैं -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, आप धीमे निष्पादन की कीमत पर पूरी तरह से सटीक मांग प्राप्त करते हैं। यह भी देखें: एफएफएमपीईजी के साथ खोज रहे हैं
  • आप उपयोग कर सकते हैं -to के बजाय -t उस टाइमस्टैम्प को निर्दिष्ट करने के लिए जिसे आप काटना चाहते हैं। तो, इसके बजाय -i <input> -ss 30 -t 10 आप भी कर सकते हैं -i <input> -ss 30 -to 40 एक ही चीज़ को प्राप्त करने के लिए।

  • अगर आपका एफएमपीपीईजी समर्थन नहीं करता है -c, या -to, यह बहुत पुराना है। एक नया संस्करण संकलित करें स्वयं या एक स्थिर निर्माण डाउनलोड करें उनके मुखपृष्ठ से। यह वास्तव में जटिल नहीं है।


317
2018-05-15 00:03



@Mondain दरअसल, आपको -ss के बाद अधिक सटीकता मिलती है। और स्लेक ने इसका उल्लेख किया है blog.superuser.com/2012/02/24/...  ffmpeg दस्तावेज़ में भी -एसएस में यह पहले या बाद में डालने के बीच एक अंतर का उल्लेख करता है। - barlop
+1 मैं पहले 35 सेकंड के बाद सब कुछ अनदेखा करने के लिए यहां आया था, धन्यवाद: ffmpeg -i input.wmv -c copy -t 35 output.wmv - karlphillip
यह मेरे लिए काम नहीं करता है (एमपी 4)। यह सिर्फ 5 सेकंड काली स्क्रीन बनाता है: frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s - clocksmith
इसने मेरी वीडियो क्लिप की शुरुआत में 3-4 एस ब्लैक स्क्रीन बनाई। छोड़ने के साथ क्रिस का संशोधन -c copy प्रारंभिक ब्लैक स्क्रीन हटा दी, विवरण के लिए उसका जवाब देखें। - joelostblom
आप लिखते हैं "निम्नलिखित पहले 30 सेकंड क्लिप करेगा, और उसके बाद 10 सेकंड बाद सब कुछ क्लिप करें:" <- इसका क्या अर्थ है? क्लिप द्वारा आप का मतलब शामिल है? 'कॉस क्लिप का मतलब क्लिप आउट हो सकता है। मान लीजिए कि आप शामिल हैं। क्या आपका मतलब 30 सेकंड से शुरू होता है, और इसमें से केवल 10 सेकंड शामिल हैं? यदि ऐसा है तो मेरा सुझाव है कि आप लिखते हैं कि यह बहुत स्पष्ट होगा। - barlop


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

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:00 1min0sec क्लिप लेता है।

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

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


78
2018-01-20 04:07



वही चेतावनी लागू होती है -c:a copy मांगने के इस तरीके के लिए। - jiggunjer
सबसे अच्छा जवाब, इस तरह मेरे लिए सबसे अच्छा काम किया। - Ondra Žižka
ऐसा लगता है कि "-ss" अब ffmpeg 2.1+ में दो बार निर्दिष्ट किए बिना तेज़ और सटीक है। trac.ffmpeg.org/wiki/Seeking - Conrad Meyer


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

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


18
2018-05-09 02:24



एक और जवाब है जो सटीकता से संबंधित है। डिफ़ॉल्ट विकल्प के साथ पुनः-एन्कोडिंग अक्सर आप नहीं करना चाहते हैं! - Tomasz Gandor
अच्छा बिंदु @ टोमाज़ गैन्डर - Chris
मैं @ TomaszGandor का जवाब बिल्कुल समझ में नहीं आया, लेकिन हटा रहा था -c copy ठीक कर दिया। - Iulian Onofrei


मैन्युअल

फ़ाइल को मीडिया प्लेयर में खोलें जो फ्रेम अग्रिम द्वारा फ्रेम करेगा और एक प्ले करेगा 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)

फिर सटीक समय प्रारूप के साथ काट लें:

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"

13
2017-09-04 05:48





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

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

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

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


7
2018-05-19 03:14



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


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

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

वीडियो के ऑडियो होने पर -कोडेक कॉपी को जोड़ना आवश्यक है, जैसा कि अन्य उत्तरों दिखाते हैं।


3
2017-12-08 11:24