Ffmpeg का उपयोग करके प्रारंभ और अंत समय पर आधारित वीडियो काटना


510

मैंने निम्न कमांड का उपयोग करके वीडियो के प्रारंभ और समाप्ति समय का उपयोग करके वीडियो को काटने की कोशिश की

ffmpeg -ss 00:00:03 -t 00:00:08 -i movie.mp4 -acodec copy -vcodec copy -async 1 cut.mp4

उपरोक्त आदेश का उपयोग करके मैं से वीडियो में कटौती करना चाहते हैं 00:00:03के लिए 00:00:08। लेकिन यह उस समय के बीच के वीडियो को नहीं काट रहा है, इसके बजाय यह वीडियो को पहले 11 सेकंड के साथ काट रहा है। किसी को भी मेरी मदद कर सकते हैं यह कैसे हल?

1 संपादित करें:

मैंने निम्नलिखित कमांड का उपयोग करके काटने की कोशिश की है जो mark4o द्वारा सुझाया गया है

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

लेकिन यह निम्नलिखित त्रुटि दिखाया गया था।

एनकोडर 'aac' प्रयोगात्मक है, लेकिन प्रयोगात्मक कोडक सक्षम नहीं हैं

इसलिए मैंने -strict -2कमांड में जोड़ा यानी,

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4

अब यह ठीक चल रहा है।


3
आपका पूर्ण, बिना ffmpeg कंसोल आउटपुट गायब है। कृपया पूछते समय इसे हमेशा शामिल करें। धन्यवाद।
slhck

3
कहाँ से मिले -स्ट्रिक्ट 2? बस जिज्ञासु के रूप में यह डॉक्स में नहीं है: ffmpeg.org/ffmpeg.html
StackOverflowed

Ffmpeg स्थापित करने के बाद इसकी गुणवत्ता के लिए, ffmpeg में आप इस विकल्प को ढूंढने में मदद कर सकते हैं
Kalai


1
मुझे लगता है कि यहां समस्या वास्तव में सिर्फ इस तथ्य की थी कि आपने फिल्म से पहले और बाद में मूवी .mp4 को डाला। उस धारा के लिए तर्क यह सही है, जाओ? इसलिए दूसरे तरीके से काम किया। = /
ब्रेंट रिटेनहाउस

जवाबों:


572

आपके पास शायद 3 सेकंड के मार्क पर कीफ़्रेम नहीं है। क्योंकि गैर-कीफ़्रेम अन्य फ़्रेमों से अंतर को एन्कोड करते हैं, उन्हें पिछले कीफ़्रेम से शुरू होने वाले सभी डेटा की आवश्यकता होती है।

Mp4 कंटेनर के साथ एक संपादन सूची का उपयोग करके पुन: एन्कोडिंग के बिना एक गैर-कीफ़्रेम में कटौती करना संभव है। दूसरे शब्दों में, यदि 3s से पहले निकटतम कीफ्रेम 0 s पर है तो यह 0 से शुरू होने वाले वीडियो की नकल करेगा और 3 सेकंड में खेल शुरू करने के लिए खिलाड़ी को बताने के लिए एक संपादन सूची का उपयोग करेगा।

यदि आप git मास्टर से नवीनतम ffmpeg का उपयोग कर रहे हैं, तो यह आपके द्वारा प्रदान की गई कमांड का उपयोग करते हुए संपादित सूची का उपयोग करते हुए करेगा। यदि यह आपके लिए काम नहीं कर रहा है, तो आप शायद ffmpeg के पुराने संस्करण का उपयोग कर रहे हैं, या आपका खिलाड़ी संपादन सूचियों का समर्थन नहीं करता है। कुछ खिलाड़ी संपादन सूची की उपेक्षा करेंगे और हमेशा शुरुआत से अंत तक फ़ाइल में सभी मीडिया को चलाएंगे।

यदि आप एक गैर-कीफ़्रेम पर शुरू होने वाली कटौती को ठीक से करना चाहते हैं और चाहते हैं कि यह एक ऐसे खिलाड़ी पर वांछित बिंदु पर शुरू हो, जो संपादन सूचियों का समर्थन नहीं करता है, या यह सुनिश्चित करना चाहता है कि कट हिस्सा वास्तव में आउटपुट फ़ाइल में नहीं है (उदाहरण के लिए) यदि इसमें गोपनीय जानकारी होती है), तो आप ऐसा कर सकते हैं कि पुन: एन्कोडिंग द्वारा ताकि वांछित प्रारंभ समय में एक कीफ़्रेम ठीक हो जाए। यदि आप निर्दिष्ट नहीं करते हैं तो पुन: एन्कोडिंग डिफ़ॉल्ट है copy। उदाहरण के लिए:

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

जब पुन: एन्कोडिंग आप अतिरिक्त गुणवत्ता से संबंधित विकल्प या एक विशेष AAC एनकोडर को शामिल करना चाह सकते हैं। विवरण के लिए, वीडियो के लिए ffmpeg का x264 एन्कोडिंग गाइड और ऑडियो के लिए AAC एन्कोडिंग गाइड देखें

इसके अलावा, -tविकल्प एक अवधि निर्दिष्ट करता है, अंत समय नहीं। उपरोक्त कमांड 3s पर शुरू होने वाले 8s वीडियो को एन्कोड करेगा। 3s पर शुरू करने और 8s उपयोग पर समाप्त करने के लिए -t 5। आप ffmpeg आप भी जगह ले सकता है के वर्तमान संस्करण उपयोग कर रहे हैं -tके साथ -toनिर्दिष्ट समय पर समाप्त करने के लिए उपरोक्त आदेश में।


4
क्या वीडियो के अंत तक निर्दिष्ट करने के लिए कोई शॉर्टकट है?
जिक्कू जोस

20
@JikkuJose: Omit the -t/ -toऔर इसके तर्क को अंत तक जारी रखने के लिए।
mark4o

41
नोट: यह -ssइनपुट फ़ाइल (पहले -i) से पहले की आपूर्ति करने के लिए तेज़ है , क्योंकि इस तरह से ffmpeg सीधे स्थान पर छोड़ देगा। हालांकि, यह उस स्थान पर "शून्य" समय भी निर्धारित करेगा, जिसका अर्थ है कि -toगलत समय इंगित करेगा। स्रोत: trac.ffmpeg.org/wiki/Seeking
माया

4
मुझे इसका उपयोग करने के बाद ऑडियो और वीडियो सिंक समस्या मिलती है ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4, हालांकि मूल फ़ाइल में ऐसा कोई मुद्दा नहीं है।
user2002522

6
@ user2002522: इसके बिना प्रयास करें -async 1
मार्क 4o 17

429

यह प्रयोग करके देखें। यह सबसे तेज़ और सबसे अच्छा ffmpeg-way है जिसका मैंने यह पता लगाया है:

 ffmpeg -ss 00:01:00 -i input.mp4 -to 00:02:00 -c copy output.mp4

यह कमांड सेकंड में आपके वीडियो को ट्रिम कर देता है!

मैंने इसे अपने ब्लॉग पर यहाँ समझाया है :

-i: यह इनपुट फ़ाइल को निर्दिष्ट करता है। उस स्थिति में, यह (input.mp4) है।
-ss: -i के साथ प्रयोग किया जाता है, यह स्थिति में इनपुट फ़ाइल (input.mp4) की तलाश करता है।
00:01:00: यह समय है जब आपका ट्रिम किया गया वीडियो शुरू हो जाएगा।
-तो: यह अवधि (00:01:40) से अंत तक (00:02:12) निर्दिष्ट करता है।
00:02:00: यह समय है जब आपका ट्रिम किया गया वीडियो समाप्त हो जाएगा।
-सी कॉपी: यह स्ट्रीम कॉपी के माध्यम से ट्रिम करने का एक विकल्प है। (एनबी: बहुत तेज़)

समय प्रारूप है: hh: mm: ss

कृपया ध्यान दें कि वर्तमान अत्यधिक उत्कीर्ण उत्तर पुराना है और ट्रिम बेहद धीमा होगा। अधिक जानकारी के लिए, इस आधिकारिक ffmpeg लेख को देखें


9
इसने 3 में मेरी 45 मिनट 720p फ़ाइल संसाधित की। यह सही उत्तर होना चाहिए।
धीरज भास्कर

7
आप अभी भी इस के साथ keyframes की कमी से पीड़ित हो सकता है। मैंने आपके दृष्टिकोण को काटने के लिए लिया, फिर यह सुनिश्चित करने के लिए स्वीकार किए गए उत्तर के अनुसार पुन: एन्कोड किया गया कि मैंने पुन: एन्कोडिंग खर्च करने के लिए आवश्यक समय की मात्रा को कम कर दिया है।
pelson

7
जैसा कि @ पील्सन कहते हैं, यह कुंजी फ़्रेमों को काट देगा और पहले कुछ सेकंड खाली छोड़ देगा (यदि काटने का समय महत्वपूर्ण फ़्रेमों के बीच है)। दिलचस्प है, पैरामीटर ऑर्डर बदलने से समस्या हल हो जाती है ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4:। अब, हालांकि, लंघन टूट गया है और अंत समय सही नहीं है (मेरे मामले में)।
राफेल

6
आपको इस उत्तर का उपयोग करना चाहिए, यदि आपको एक सटीक मिलिसेकंड पर ट्रिम करने की आवश्यकता नहीं है, इस प्रकार यह उपलब्ध निकटतम कीफ्रेम का चयन करेगा। इसलिए यह बहुत तेज़ है, यह निकटतम कीफ़्रेम का चयन करता है और स्निपेट को रीकोडिंग की आवश्यकता के बिना बाहर निकालता है। हालांकि, अगर आपको एक सटीक समय की आवश्यकता है, तो निकटतम कीफ़्रेम लेना पर्याप्त नहीं है, क्योंकि यह निश्चित रूप से बिल्कुल मेल नहीं खाएगा। उपलब्ध एकमात्र समाधान वीडियो को फिर से लोड करना है, और इसीलिए यह इतना धीमा है। यह एकमात्र उपाय है, हालांकि, अगर आपको इसकी आवश्यकता है। इसलिए अन्य उत्तर को स्वीकार किया जाना चाहिए, क्योंकि ओपी का मुद्दा क्या था।
यमनकेओ

4
निश्चित नहीं, लेकिन यह स्वीकृत उत्तर की तुलना में अधिक सही प्रतीत नहीं होता है क्योंकि इससे गायब की-फ्रेम के साथ समस्याएँ होती हैं। लघु वीडियो क्लिप के लिए प्रभाव अस्वीकार्य है। ऐसे मामलों में स्लो रेनकोड ही एकमात्र उपाय लगता है।
icarus74

91
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4 

तत्काल में बनाने के लिए -c कॉपी का उपयोग करें । उस स्थिति में ffmpeg वीडियो को फिर से एनकोड नहीं करेगा, बस आकार के अनुसार कट जाएगा।


2
-c प्रतिलिपि महान काम करती है, लेकिन केवल तभी जब मैं हटाता हूं -sync 1
dorien

2
यह विभिन्न इनपुट और आउटपुट कंटेनरों जैसे .mkv इनपुट और .mp4 आउटपुट के मामले में अमान्य हेडर के कारण लिखने में विफल रहता है।
अस्सिल Ksiksi

1
ठीक है, .mkv को .mp4 में परिवर्तित करने के लिए आपको एक और कमांड का उपयोग करना होगा: ffmpeg -i movie.mkv -vcodec copy -acodec copy converted_movie.mp4और
vise

पुनः एन्कोडिंग के क्या फायदे हैं? अगर हम सिर्फ एक ही प्रारूप में छोटे वीडियो चाहते हैं तो क्या यह किसी काम का है?
हर्षा

29
    ffmpeg -i movie.mp4 -vf trim=3:8 cut.mp4

दूसरे 3 से 8 8 को छोड़कर सब कुछ छोड़ दें।


4
मुझे इसके साथ पहले 8 सेकंड मिलते हैं, साथ ही पहले फ्रेम पर पहले 3 सेकंड जमे हुए हैं। setpts=PTS-STARTPTSट्रिम फिल्टर के बाद फिल्टर का पीछा करते हुए फिक्स्ड ।
जिगगंजर

यह कहता है "एनकोडर 'एएसी' प्रायोगिक है लेकिन प्रायोगिक कोडेक सक्षम नहीं हैं, यदि आप इसका उपयोग करना चाहते हैं तो '-स्ट्रिक्ट -2' जोड़ें।" जोड़ना -स्ट्रिक्ट -2 मदद नहीं करता है। परिणाम एक शून्य लंबाई फ़ाइल है।
इवान

4
@ इवान, क्या आपने -strict -2पहले जोड़ने की कोशिश की थी cut.mp4(कमांड लाइन के अंत के विपरीत)?
जन गोंडोल

अरे, क्या आप मुझे बता सकते हैं कि मुझे केवल 3 से 8 सेकंड के बिना वीडियो चाहिए?
पार्थ सोलंकी


21

स्रोत वीडियो से प्रारंभ और समाप्ति समय के आधार पर कटौती करने और गणित करने से बचने के लिए, अंत समय को इनपुट विकल्प और प्रारंभ समय को आउटपुट विकल्प के रूप में निर्दिष्ट करें।

ffmpeg -t 1:00 -i input.mpg -ss 45 output.mpg

यह 0:45 से 1:00 तक 15 सेकंड की कटौती का उत्पादन करेगा।

इसका कारण यह है कि जब -ssआउटपुट विकल्प के रूप में दिया जाता है, तब भी छोड़े गए समय को इनपुट से पढ़े गए कुल समय में शामिल किया जाता है, जिसका -tउपयोग यह जानना है कि कब रुकना है। जबकि यदि -ssएक इनपुट विकल्प के रूप में दिया गया है , तो प्रारंभ समय की तलाश की जाती है और उसे नहीं गिना जाता है , जो कि भ्रम कहां से आता है।

यह छूटने के बाद से मांगने की तुलना में धीमी है क्योंकि अभी भी खारिज होने से पहले संसाधित किया गया है, लेकिन यह एकमात्र तरीका है जहां तक ​​मुझे पता है। यदि आप किसी बड़ी फ़ाइल के भीतर गहराई से क्लिपिंग कर रहे हैं, तो यह केवल और केवल गणित करने और -ssइनपुट के लिए उपयोग करने के लिए अधिक विवेकपूर्ण है ।


4
धीमी गति से, लेकिन केवल एक चीज ने मेरे लिए काम किया (अन्य उत्तरों से फ्रेम
खोए

8

यहाँ मेरा उपयोग है:

ffmpeg -i input.mkv -ss 00:01:00 -to 00:02:00 -c:v copy -c:a copy output.mp4

जनरेट की गई mp4फ़ाइलों का भी उपयोग किया जा सकता है iMovie

संदर्भ: https://www.arj.no/2018/05/18/trimvideo


यदि आप कई कट दृश्यों को संक्षिप्त करना चाहते हैं, तो आप निम्नलिखित स्क्रिप्ट का उपयोग कर सकते हैं:

#!/usr/bin/env python3

import subprocess

name = "batman.mp4"

times = []
times.append(["01:06:00", "01:07:00"])
times.append(["01:08:00", "01:09:00"])

open('concatenate.txt', 'w').close()
for idx, time in enumerate(times):
    output_filename = f"output{idx}.mp4"
    cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", output_filename]
    subprocess.check_output(cmd)
    with open("concatenate.txt", "a") as myfile:
        myfile.write(f"file {output_filename}\n")

cmd = ["ffmpeg", "-f", "concat", "-i", "concatenate.txt", "-c", "copy", "final.mp4"]
output = subprocess.check_output(cmd).decode("utf-8").strip()

हालांकि इसका उत्तर पहले ही दिया जा चुका है
Tessaracter

1
मेरा दृष्टिकोण स्वीकृत उत्तरों से अलग है। मैंने उन लोगों की कोशिश की है जिनके पास mp4 फ़ाइल बनाने के लिए अधिक समय है। @Tessaracter
alper

1
यह केवल यहाँ का उत्तर है जिसने मेरे लिए एक बड़े वीडियो से एक छोटी क्लिप काटने का काम किया। यह काम करता है और फास्ट !!! धन्यवाद
लैकोस्टेनकोडर

1
आपका स्वागत है, मुझे खुशी है कि मैं मदद कर सकता हूं। मैं कई तरीकों की कोशिश करने के बाद इस जवाब को खोजने में सक्षम था। उनमें से अधिकांश बहुत धीमी गति से थे। @lacostenycoder
alper

क्या यह केवल "-सी" का उपयोग "कॉपी" के साथ बाहर बंटने के बजाय -c: v और -c: a?
शाम


-3

भले ही मुझे 6 साल की देर हो गई हो, लेकिन मुझे लगता है कि ऊपर दिए गए सभी सवालों के ठीक से पता नहीं चल पाया है। नीचे दिए गए bash स्क्रिप्ट निम्नलिखित प्रारूप में एक पाठ फ़ाइल को संसाधित करेगा:

URL | start_time | end_time | filename

उदाहरण के लिए

https://www.youtube.com/watch?v=iUDURCrvrMI|00:02:02|00:03:41|1

और फ़ाइल के माध्यम से लूप, फ़ाइल है कि डाउनलोड करता है youtube-dlसमर्थन करता है, की गणना के बीच की अवधि start_timeऔर end_timeऔर करने के लिए इसे पारित ffmpeg, क्योंकि -tवास्तव में है अवधि , नहीं असलीend_time

अगर आपको कोई सवाल है तो मुझे मारो।

    for i in $(<video.txt);
    do
        URL=`echo $i | cut -d "|" -f 1`;
        START=`echo $i | cut -d "|" -f 2`;
        END=`echo $i | cut -d "|" -f 3`;
        FILE=`echo $i | cut -d "|" -f 4`;

        SEC1=`echo $START | sed 's/^/((/; s/:/)*60+/g' | bc`
        SEC2=`echo $END | sed 's/^/((/; s/:/)*60+/g' | bc`

        DIFFSEC=`expr ${SEC2} - ${SEC1}`

        ffmpeg $(youtube-dl -g $URL | sed "s/.*/-ss $START -i &/") -t $DIFFSEC -c copy $FILE".mkv";
        ffmpeg -i $FILE".mkv" -f mp3 -ab 192000 -vn $FILE".mp3";
        rm $FILE".mkv";
    done;

यह केवल एक एमपी 3 ऑडियो फ़ाइल और एक वीडियो नहीं आउटपुट।
लैकोस्टेनकोडर

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