कमांड लाइन से वीडियो फ़ाइलों को सटीक रूप से काटें


22

मुझे एक क्ली एप्लिकेशन ढूंढने में समस्या हो रही है जो वीडियो फ़ाइल (एवीआई, एमकेवी, और mp4 अधिमानतः) ले सकता है और सटीक समय सटीकता के साथ बहुत छोटी क्लिप (2-6 सेकंड) काट सकता है। मैं ffmpeg , mencoder , avidemux , और mp4box की कोशिश की है , लेकिन वे सभी keyframes पर कटौती जो 6 + दूसरी क्लिप बनाता है। क्या कोई उपकरण है जो इनपुट फ़ाइल को फिर से एनकोड करेगा और सटीक समय को काट देगा या गलत तरीके से काटेगा, फिर से एनकोड करेगा, और फिर सटीक रूप से काटेगा?


आपको इसे सही करने के लिए काटने से पहले शायद रीकोड करना होगा। आप शायद पहले कीफ़्रेम को काटकर चीजों को गति दे सकते हैं और केवल स्निपेट को फिर से लोड कर सकते हैं।
निफले

4
जो FFmpeg कमांड आपने आज़माया है, बिल्कुल? मेरा मानना ​​है कि यदि आप पहले वीडियो को डिकोड करते हैं (यानी -ssपैरामीटर को बाद में रखें -i ), तो यह अधिक सटीक होना चाहिए।
19

1
FFmpeg चाल काम किया! मुझे यह एहसास नहीं था कि यह आदेश कितना मायने रखता है। क्या यह किसी भी अन्य उपकरण के लिए समान है?
curmil

जवाबों:


23

के साथ वीडियो काटना ffmpeg

आप FFmpeg के साथ वीडियो को सटीक रूप से काट सकते हैं । संस्करण 2.5 के बाद से यह बहुत आसान है। यह उदाहरण के लिए 10 सेकंड में कटौती, 0 मिनट, 3 सेकंड और 123 मिलीसेकंड से शुरू होगा।

ffmpeg -ss 00:00:03.123 -i input.mp4 -t 10 -c:v libx264 -c:a copy out.mp4

स्थिति और समय या तो सेकंड या रूप में hh:mm:ss[.xxx]हो सकता है।

ध्यान दें कि इन उदाहरणों में, x264 एनकोडर का उपयोग करके वीडियो को फिर से एनकोड किया जाएगा ; ऑडियो कॉपी किया गया है।

आप अवधि के बजाय अंतिम बिंदु को निर्दिष्ट करने के -toबजाय उपयोग कर सकते हैं -t। इस मामले में, हालांकि, -toके बराबर है -t, क्योंकि -ssसामने रखकर -i, ffmpeg पहले उस बिंदु की तलाश करेगा और फिर आउटपुट करना होगा।

सीकिंग विकी प्रविष्टि भी देखें ।


पुराने ffmpegसंस्करणों के लिए सटीक कटिंग

यदि आपके पास ffmpeg का पुराना संस्करण है, तो सटीक खोज के लिए, आपको उसके -ssबाद जगह देने की आवश्यकता है -i, जो एन्कोडिंग प्रक्रिया को थोड़ा धीमा कर देता है, क्योंकि पूरे वीडियो को पहले डीकोड करना होगा:

ffmpeg -i input.mp4 -ss 00:00:03.123 -t 10 -c:v libx264 -c:a copy out.mp4

यहाँ, -toऔर -tअलग तरह से व्यवहार करते हैं। -t 10एक दस सेकंड लंबी क्लिप -to 10बनाएगा , जबकि एक क्लिप बनाएगा जो सात सेकंड लंबा हो।


इसके बजाय -c:v libx264 -c:a libfaacमुझे लगता है कि हम उपयोग कर सकते हैं -acodec copy -vcodec copyजो ffmpeg को मूल फ़ाइल के समान कोडेक्स का पता लगाने और उपयोग करने के लिए कहता है। क्या कोई पुष्टि कर सकता है?
बोडाद

2
@ बाओदाद आप कर सकते हैं, लेकिन यह सही कटौती नहीं करेगा । वीडियो / ऑडियो बिटस्ट्रीम की प्रतिलिपि बनाते समय, ffmpeg को एक कीफ़्रेम पर शुरू करने की आवश्यकता होती है, जिसे बस हर दूसरे या आगे भी अलग रखा जा सकता है।
slhck

"अज्ञात एनकोडर 'लिफ़ाफ़ेक'" त्रुटि को कैसे दूर किया जाए?
डग

@ डॉग एक अलग एनकोडर चुनें, उदाहरण के लिए -c:a aac -strict experimental। यही सबसे सरल उपाय है।
slhck

1

केवल लिनक्स कमांड-लाइन टूल जो मैंने अभी तक पाया है, जो सटीक फ्रेम (या फ्रेम सटीकता के साथ) में कटौती कर सकता है, melt( sudo apt-get install melt) है।

मान inputvid.mp4लीजिए कि आपके पास पहला है - इसकी एन्कोडिंग सेटिंग को चेक करें ffmpeg(यहां, मैं कहता हूं कि मैं इसे फिर से एन्कोड करना चाहता हूं -f mp4, लेकिन जैसे-जैसे फ़ाइल /dev/nullको आउटपुट खारिज कर दिया जाता है; मुझे स्ट्रीडर पुनर्निर्देशित होता है, इसलिए मैं इसके माध्यम से संक्षिप्त कर सकता हूं - बीच में ध्यान दें , कमांड संकेत देता है, और आपको yENTER के साथ उत्तर देना चाहिए , इसलिए प्रक्रिया उपयोगी हो जाती है और उपयोगी जानकारी को डंप कर देती है, यह Ubuntu 14 पर ffmpeg 3.3.3 के साथ है):

ffmpeg -i inputvid.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709), 640x360 [SAR 1:1 DAR 16:9], 389 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p(progressive), 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

ठीक है, इसलिए हम इस वीडियो के लिए ffmpegचुनिंदा libx264और aacएनकोडर देख सकते हैं ; तब हम इसमें प्रवेश कर सकते हैं melt:

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac vcodec=libx264

.... और meltएक नई फ़ाइल में 7235 और 7349 फ्रेम के बीच के टुकड़े के साथ कट जाएगा cut.mp4। फिर जांच करने के लिए कि क्या cut.mp4सही ढंग से लूप है, meltइसे दो बार वापस खेलने के लिए फिर से उपयोग करें - और इसे एसडीएल विंडो में खेलें:

melt cut.mp4 cut.mp4 -consumer sdl

... और यहाँ ffmpegइस फ़ाइल के लिए क्या देखता है:

ffmpeg -i cut.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'    encoder         : Lavf54.20.4
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 526 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 182 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

389 kb / s से 526 kb / s तक परिवर्तित वीडियो बिटरेट cut.mp4को inputvid.mp4छोड़कर वीडियो एन्कोडिंग सेटिंग्स समान प्रतीत होती हैं , और ऑडियो एन्कोडिंग सेटिंग्स भी लगभग समान हैं, सिवाय इसके कि नमूना दर 44100 से बदलकर 48000 Hz हो गई है; हालांकि इसके साथ विनियमित किया जा सकता है:

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac ar=44100 ab=95k vcodec=libx264 vb=389k

... हालाँकि, इसके साथ भी, मेरे लिए अंतिम वीडियो बिटरेट 337 kb / s तक समाप्त हो गया है। फिर भी, कटौती लूप ठीक है (और इसमें ऑडियो भी शामिल है) जब एक लूप में खेला जाता है, तो मुझे लगता है कि यह वास्तव में फ्रेम-सटीक है ...


1
meltवीडियो को फिर से एन्कोडिंग है, और यह नीचे FFmpeg लाइब्रेरी का उपयोग करता है। यदि आप पुन: एन्कोडिंग की अनुमति देते हैं, तो ffmpeg उसी आउटपुट का उत्पादन कर सकता है।
ज्ञान

धन्यवाद @ ज्ञान - उस के बारे में पता नहीं था (विशेष रूप से meltFFmpeg पुस्तकालयों का उपयोग करता है), यह जानकर अच्छा लगा!
सादाऊ

पिघल ffmpeg की तुलना में उपयोग करने के लिए आसान लग रहा है, हम सभी की जरूरत है, विशेष रूप से घंटा, मिनट, सेकंड फार्म, या घंटा, मिनट, सेकंड, एमएस में समय निर्दिष्ट करने के लिए एक तरीका है, जो उन्हें सही फ्रेम में धर्मान्तरित करता है।
बार्लॉप

0

जैसे बॉडैड ने टिप्पणियों में कहा (मैं पोस्ट करता हूं क्योंकि यह पता लगाना आसान नहीं है कि आप जल्दी से पढ़ते हैं), बेहतर तरीका यह है कि ऑडियो / वीडियो एनकोडर को स्वचालित रूप से ffmpeg द्वारा पता लगाया जाए, इसलिए:

ffmpeg -ss 00:05:17.18 -i in.mp4 -t 00:06:29.10 -acodec copy -vcodec copy out.mp4 
  • शुरू @ 00: 05: 17.18
  • input = in.mp4
  • stop @ 00: 06: 29.10
  • आउटपुट = out.mp4

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