Ffmpeg के साथ / लूप इनपुट वीडियो दोहराएं?


52

मैं बस ffmpeg के साथ एक mp4 वीडियो को लूप करना चाहता हूं और वर्तमान सेटिंग्स और कोडेक रखना।

उदाहरण के लिए अगर input.mp4 0:10 लंबा है, और मैं इसे 4 बार लूप करना चाहूंगा, तो आउटपुट .mp4 0:40 लंबा है, मैं ऐसा करने के लिए निम्न कमांड लाइन कैसे बदल सकता हूं?

ffmpeg -i input.mp4 -c copy output.mp4

मैंने कोशिश की...

ffmpeg -loop 4 -i input.mp4 -c copy output.mp4

... लेकिन मुझे त्रुटि "विकल्प लूप नहीं मिला।"


क्विकटाइम 7 प्रो और मूव कंटेनर का इस्तेमाल करें। तो आप एक बड़ा फ़ाइल आकार नहीं मिलेगा, खुलता है।
मित्रलोवितन Мышков

जवाबों:


69

कॉनटैट डिमॉक्सर

यह आपको फिर से एनकोड करने की आवश्यकता के बिना एक इनपुट को लूप करने की अनुमति देता है।

  1. एक पाठ फ़ाइल बनाएँ। 4 बार दोहराने के लिए एक उदाहरण पाठ फ़ाइल की सामग्री।

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. फिर चलाएं ffmpeg:

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

लिनक्स उपयोगकर्ताओं के लिए

यह उदाहरण ऊपर जैसा है लेकिन आपको मैन्युअल रूप से बनाने की आवश्यकता नहीं है list.txt:

for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4

सबसे अधिक उपयोग किए जाने वाले आधुनिक गोले के साथ, आप list.txtपूरी तरह से फ़ाइल के निर्माण से भी बच सकते हैं । उदाहरण के लिए, बैश के साथ:

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4

और देखें:


लूप फिल्टर

4 बार लूप फिल्टर का उपयोग करके उदाहरण , प्रत्येक लूप 75 फ्रेम है, प्रत्येक लूप इनपुट के पहले 25 फ्रेम को छोड़ देता है:

ffmpeg -i input -filter_complex loop=loop=3:size=75:start=25 output
  • या शॉर्टहैंड का उपयोग करें: loop=3:75:25
  • फ़िल्टरिंग के लिए पुनः एन्कोडिंग की आवश्यकता होती है।
  • यह फ़िल्टर सभी फ़्रेमों को मेमोरी में रखता है
  • loop=34 बार लूप का उपयोग करना होगा।
  • लूप को असीम रूप से उपयोग करने के लिए -1
  • आपको लूप को फ़्रेम की संख्या सूचीबद्ध करनी चाहिए (ऊपर उदाहरण में 75 के रूप में दिखाया गया है)। अधिकतम मूल्य 32767 है।
  • यह भी देखें ffmpeg -h filter=loop

फिल्म फिल्टर

फिल्म फिल्टर एक पाश का विकल्प है। नीचे देखें मोना टुक द्वारा उत्तर । फ़िल्टरिंग के लिए पुनः एन्कोडिंग की आवश्यकता होती है। ऑडियो के लिए एमोवी फिल्टर का उपयोग करें।


-stream_loop विकल्प

थिंग द्वारा नीचे उत्तर देखें और ज्ञान द्वारा उत्तर दें

ध्यान दें कि यह विकल्प था गाड़ी (देखें बग रिपोर्ट # 5719 , # 6121 , और # 7043 ) तो वर्ष बनाता है के लिए काम नहीं कर सकते हैं (कुछ भी से अधिक उम्र के 2018 06-27 FFmpeg 4.0.x रिलीज शाखा सहित)। पुराने बिल्ड के उपयोगकर्ताओं के लिए, जैसा कि टिकट # 6121 में mulvya द्वारा उल्लिखित है, एक वर्कअराउंड पहले एमकेवी या टीएस को फिर से डाउनलोड करना -stream_loopहै और फिर अगले कमांड में उपयोग करना है।


-loop विकल्प

-loopविकल्प के लिए विशिष्ट है छवि फ़ाइल demuxer और gif म्युक्सर , तो यह ठेठ वीडियो फ़ाइलों के लिए नहीं किया जा सकता है, लेकिन यह असीम पाश के लिए इनपुट छवियों की एक श्रृंखला के लिए इस्तेमाल किया जा सकता है। यह उदाहरण बार-बार लूप करेगा लेकिन -t 30उत्पादन अवधि को 30 सेकंड तक सीमित करेगा:

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

या GIF आउटपुट को लूप करने के लिए:

ffmpeg -i input -loop 3 output.gif

यह mp4 फ़ाइलों के साथ ठीक काम करता है?
थॉमस किंग

3
मुझे यह त्रुटि मिलती है> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
JZ11

1
@jamesfzhang - मुझे लगता है कि क्योंकि आपको फ़ाइल के लिए एक पूर्ण पथ की आवश्यकता है (जैसा कि यहां बताया गया है: trac.ffmpeg.org/wiki/Concatenate )। उसे पूरा करने के लिए, आप लिख सकते हैं: ffmpeg -safe 0 -f concat -i <(मैं में 1. 1..4}; प्रिंटफ "फाइल '$ पीडब्ल्यूडी' / '% s' \ n" input.mp4; किया; ) -c copy output.mp4
प्लेनस फ्रेंक्ली

1
मेरे लिए यह 4 बार के लिए लंघन के बिना पूर्णकालिक वीडियो को दोहराने के लिए काम करता हैffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
व्लाद

यह मुद्दा 4 साल पुराना है और किसी ने इस बात पर ध्यान नहीं दिया है कि -stream_loopअनुभाग में दूसरे अंक का लिंक उसी टिकट की ओर इशारा कर रहा है जो पहले ...
लियोनिद उसोव

15

कम से कम FFmpeg 2.8.x पर (लेकिन पुराना भी काम करना चाहिए) आप विकल्प के लिए एक तर्क के lavfiरूप में इनपुट प्रारूप और जटिल फिल्टर ग्राफ का उपयोग movieऔर setptsफ़िल्टर के रूप में उपयोग कर सकते हैं -i

आपके लिए यह काम करने वाली अगली कमांड:

ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4

शून्य loop=तर्कों का अर्थ है अनंत लूप। अधिक से अधिक शून्य सेटों की गणना दोहराई जाती है। setptsपीटीएस के लिए दूसरे और बाद में दोहराए जाने के लिए आवश्यक फिल्टर, अन्यथा अधिकांश आउटपुट muxers गैर-मोनोटोनिक पीटीएस बढ़ने के साथ विफल हो जाएंगे: लूप पीटीएस की पुनरावृत्ति नहीं करता है।

ध्यान दें, यह मानकर कि डिकोडिंग / एन्कोडिंग के बिना फ्रेम को बायपास करना असंभव है: डिजाइन फिल्टर्स केवल डीकोड किए गए फ्रेम से संबंधित हैं।

FFmpeg 2.8.2 में नए इनपुट विकल्प को -stream_loopसम्मिलित किया गया है। मैं पहली बार देखता हूं कि यह अधिक सरल है और ट्रांसकोडिंग के बिना कॉपी कंटेंट की अनुमति देता है:

ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4

लेकिन यह PTS को पुनर्गणना नहीं करता है और आउटपुट फ़ाइल गलत है। यदि आप PTS को ठीक करने के लिए फ़िल्टर जोड़ते हैं (देखें setpts) तो आपको -c copyभी निकालना होगा । केवल बिटस्ट्रीम फ़िल्टर एन्कोड किए गए पैकेट से संबंधित हो सकते हैं, लेकिन PTS को ठीक करने के लिए कोई भी बिटस्ट्रीम फ़िल्टर नहीं है (देखें: https://ffmpeg.org/ffmpeg-bitstream-filters.html )

किसी भी मामले में दूसरे पास पर ffmpeg त्रुटि के साथ विफल रहता है:

input.mp4: Resource temporarily unavailable

मेरे लिए ज्ञात काम : PTS सीमा (स्ट्रीमिंग कंटेनर) के बिना इनपुट फ़ाइल के लिए कंटेनर का उपयोग करें। उनमें से एक, मुझे जाना जाता है, एमपीईजी-टीएस है। तो, आप अपनी MP4 फाइल को MPEG-TS में बदल सकते हैं:

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts

और इन्फिनिटी फ़ाइल बनाने के लिए अगले कमांड का उपयोग करें:

ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4

(बिटस्ट्रीम फिल्टर्स का उपयोग केवल तभी किया जाना चाहिए जब मेरे नमूनों पर यह आवश्यक हो)

इस मामले में FFmpeg> = 2.8.2 की आवश्यकता है।


1
उस कमांड को चलाने से मुझे त्रुटि मिलती है: "[mp4 @ 00000000053fa1a0] को कोडेक रॉविडियो के लिए टैग # 0 स्ट्रीम में नहीं मिल रहा है, कोडेक वर्तमान में कंटेनर में समर्थित नहीं है"। अगर मैं -vcodec h264 को इनपुट से पहले जोड़ता हूं, तो वह त्रुटि गायब हो जाती है, लेकिन एनकोडर बाहर नहीं निकलता है। एक गैर-शून्य लूप काउंट की आपूर्ति करने से बहुत सारी त्रुटियां होती हैं, लेकिन यह बाहर निकल जाता है। फ़ाइल एक मान्य आउटपुट नहीं है।
ज्ञान

1
Stream_loop के लिए प्रलेखन का कहना है कि "लूप 0 का मतलब लूप नहीं है, लूप -1 का अर्थ है अनंत लूप।"
ज्ञान

गलत इनपुट फ़ाइलें लगता है। क्या आप इसे साझा कर सकते हैं? "लूप 0 का अर्थ लूप नहीं है, लूप -1 का अर्थ है अनंत लूप।" - लगता है मैं पुराने डॉक्स को देख रहा हूं :-)
मोना टुक

1
मैं भूल गया: फ़िल्टर ट्रांसकोडिंग (डीकोड / एनकोड) मान रहा हूं। डिजाइन द्वारा। इसलिए आपको हटाना होगा -c copy। जवाब तय है।
मोनाहुक

1
जानकर अच्छा लगा, लेकिन अगर आपके पास एक बड़ा लूप है, तो आप इसे तैयार कर सकते हैं।
ज्ञान १

14

Ffmpeg 2.8.4 के साथ, निम्न कमांड output.mp4 बनाता है, जो कि ffmpeg प्रक्रिया बंद होने तक input.mp4 की एक दोहराई जाने वाली प्रतिलिपि है:

ffmpeg -stream_loop -1 -i input.mp4 -c copy output.mp4

यह आदेश अपने आप समाप्त नहीं होगा, और आउटपुट फ़ाइल असीम रूप से बढ़ेगी।


2
सबसे तेज़ तरीका लगता है
josef

2
सबसे तेज़ विधि एक समझ है, यह विधि सेकंड के एक मामले में बहु-घंटे वीडियो तक रैंप करती है।
स्लीघबॉय

यह एक महान सुविधाजनक विधि है, क्योंकि दोहराई जाने वाली लाइनों के साथ फ़ाइल बनाने की कोई आवश्यकता नहीं है।
मार्कस ज़ेलर

-1

Q: "... मैं ऐसा करने के लिए निम्न कमांड लाइन को कैसे बदल सकता हूं? Ffmpeg -i input.mp4 -c copy output.mp4"?

एक: सरल विधि जो समस्याओं से बचाती है, कमांड किस कार्य के साथ 'तुच्छ समाधान' है:

ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c copy output.mp4

इसे भी देखें: https://trac.ffmpeg.org/wiki/Concatenate कई उदाहरणों के लिए।


2
यह कोई संगति नहीं करता है । कम से कम कॉनकैट विधियों में से एक का उपयोग किया जाना है: प्रोटोकॉल, फ़िल्टर या डिमॉक्सर। इस कमांड में, ffmpeg की ऑटो मैपिंग इनपुट के बीच से एक वीडियो, एक ऑडियो और एक उपशीर्षक स्ट्रीम का चयन करेगी। चूंकि वे समान हैं, यह ओपी की पहली कमांड के बराबर है।
ज्ञान

मुल्व्या परीक्षण के लिए धन्यवाद, क्योंकि यह डॉक्स में वर्णित व्यवहार से अलग है: ffmpeg.org/ffmpeg.html#Description - अगर "-i /tmp/test/d.mp4" () का उपयोग कर फ़ाइल नामों में समानता है et। al) भी संभव है।
रोब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.