अतिरिक्त फ़ाइल के बिना, एकल कमांड का उपयोग करके कई WAV फ़ाइलों को सम्‍मिलित करें


32

मैं FFMPEG का उपयोग करके एक एकल WAV फ़ाइल में कई WAV फ़ाइलों को संक्षिप्त करना चाहता हूं।

मैंने निम्न कमांड का उपयोग किया है और यह आवश्यक फ़ाइल उत्पन्न करता है।

कमान:

ffmpeg -f concat -i mylist.txt -c copy output.wav

फ़ाइल:

#mylist.txt
file '1.wav'
file '2.wav'
file '3.wav'
file '4.wav'

लेकिन जैसा कि आप देख सकते हैं कि समस्या यह है कि मुझे संक्षिप्त करने के लिए WAV फ़ाइलों की सूची निर्दिष्ट करने के लिए एक पाठ फ़ाइल बनानी होगी।

मैं इन सभी कार्यों को कर सकता हूं, लेकिन मैं एक एकल कमांड को पसंद करूंगा जो कुछ दिखता है

ffmpeg -i 1.wav -i 2.wav -i 3.wav -i 4.wav output.wav 

या

ffmpeg -i "concat:1.wav|2.wav|3.wav|4.wav" -c copy output.wav

मैंने इन दो सरल आदेशों की कोशिश की है, लेकिन वे 1.wav कृपया केवल एक आदेश लिखने में मेरी मदद करें (या उपरोक्त 2 आदेशों को सही करने के लिए) जो वांछित परिणाम प्राप्त करता है।

कृपया अन्य मीडिया एन्कोडर्स / संपादकों को सुझाव न दें, मैं केवल FFMPEG का उपयोग करना चाहता हूं, क्योंकि यह पहले से ही स्थापित है और अन्य स्थानों पर उपयोग किया जाता है।

जवाबों:


34

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

ffmpeg -i input1.wav -i input2.wav -i input3.wav -i input4.wav \
-filter_complex '[0:0][1:0][2:0][3:0]concat=n=4:v=0:a=1[out]' \
-map '[out]' output.wav

यदि आपके पास पाँच इनपुट फ़ाइलें हैं, तो उपयोग करें n=5


4
नोट: [0:0][1:0][2:0][3:0]फ़ाइलों की संख्या से मेल करने के लिए अनुकूलित न करें। जैसा कहता है वैसा ही प्रयोग करो। केवल एक चीज जिसे आपको बदलना चाहिए वह है इनपुट फाइलें और n=4
केवॉन

8
@ केवॉन: क्या आपको यकीन है? यहां ffmpeg (संस्करण N-49352-gc46943e x64) शिकायत करता है Too many inputs specified for the "concat" filter.जब मैं मूल कोड के साथ केवल 2 इनपुट को संसाधित करने का प्रयास करता हूं। हालांकि यह तब काम करता है जब मैं हटाता हूं [2:0][3:0]... जो मेरे लिए समझ में आता है क्योंकि इस मामले में धाराएं जैसी कोई चीज नहीं हैं 2:0और 3:0...
बिग नूइक

मैं @ थकान से सहमत हूँ। मैं भी उसी त्रुटि में भाग गया और हालांकि यह थोड़ा मूर्खतापूर्ण लगता है, दिए गए उचित अनुक्रम को उत्पन्न करने के लिए कुछ कोड लिखे n
रयान डूवल

19

मुझे लगता है कि सबसे अच्छा विकल्प साबुन का उपयोग करना है, न कि ffmpeg:

$ sox short1.wav short2.wav short3.wav long.wav

समाधान से आता है कि मैं (। शून्य-गद्देदार) संख्यात्मक आदेश को बनाए रखते हुए .wav फ़ाइलों का एक गुच्छा कैसे संलग्न करूं?


1
यह काम कर सकता है .wav, लेकिन soxसमर्थन नहीं करता है .mp3
हारून फ्रेंके

1
प्रश्न लगभग ठीक था.wav
Héctor M. Monacci

1
मुझे पता है, मैं सिर्फ उन लोगों के लिए एक नोट जोड़ रहा हूं जो गैर-लहराती फ़ाइलों के साथ इस पद्धति का उपयोग करने की कोशिश करते हैं।
हारून फ्रेंक

प्रश्न स्पष्ट रूप से कहा गया है कि केवल ffmpeg का उपयोग करके एक समाधान आवश्यक है!
मनु

sox समर्थन कर सकते हैं। एमपी 3 फ़ाइलें भी
बेंजामिन

9

FFmpeg विकी उल्लेख का उपयोग कर concatप्रोटोकॉल सभी फ़ाइल प्रकारों के साथ संभव नहीं है। यह अधिकांश एमपीईजी कंटेनरों और बिटस्ट्रीम के साथ ठीक काम करता है, लेकिन जाहिर है कि पीसीएम ऑडियो के साथ WAV फाइलें नहीं हैं।

जरूरी नहीं कि आपको एक अस्थायी फ़ाइल बनानी पड़े और उसका उपयोग करना पड़े। बैश (या अन्य शेल जो प्रक्रिया प्रतिस्थापन का समर्थन करते हैं ) के साथ, आप एक ही कमांड में सब कुछ कर सकते हैं:

ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) output.wav

प्रक्रिया प्रतिस्थापन <( )एक फ़ाइल बनाता है - या, सटीक होने के लिए, एक फ़ाइल विवरणक - मक्खी पर, जो ffmpegपढ़ सकता है। इस फ़ाइल .wavमें वर्तमान निर्देशिका में प्रत्येक फ़ाइल का पथ होगा । हमें $(pwd)आपकी वर्तमान निर्देशिका के सापेक्ष सही मार्ग प्राप्त करने के लिए इसे उपसर्ग करना होगा , न कि फाइल डिस्क्रिप्टर के सापेक्ष।

बेशक, प्रतिस्थापन के भीतर कमांड को कुछ और में बदला जा सकता है।


2
यदि आपको Unsafe file nameत्रुटि मिलती है तो आपको -safe 0पहले विकल्प की आवश्यकता होगी -i। रेफरी। stackoverflow.com/q/38996925/297679
नोबू

3

एक अन्य विकल्प कॉनैट का उपयोग करना है

ffmpeg -i "concat: file1.mp3 | file2.mp3 | file3.mp3" -acodecite out.mp3


1
सुपरयुजर में आपका स्वागत है: हालांकि यह प्रश्न का उत्तर दे सकता है या नहीं भी दे सकता है, (एक उत्तर स्वीकार किया गया है) यह एक बेहतर उत्तर होगा यदि आप कुछ स्पष्टीकरण प्रदान कर सकते हैं कि आपका समाधान विस्तार से क्यों काम करता है और निर्देशों का पालन करने में आसान है। यदि आपको लगता है कि आपका उत्तर सही है तो इन चीजों को करें और पुनः संपादित करें। कृपया कुछ मिनट लें और पढ़ें: - superuser.com/help .Answering: superuser.com/help/how-to-answer , फिर से superuser में आपका स्वागत है।
धन्यवाद

मैंने यह परीक्षण किया है और यह काम करने के लिए प्रकट नहीं होता है
निक लांग

1

Win8 के Cmd.EXE में .BAT स्क्रिप्ट:

Rem Get number of source files
For /F %%A In ('Dir *.3gp /B /A-D ^| Find /C /V ""') Do      Set FilCnt=%%A

Rem Build list of source filenames
Set Lst=
For    %%A In (     *.3gp                          ) Do Call Set Lst=%%Lst%% -i %%A

Rem Concat and Convert sources to target
FFMPeg.EXE %Lst% -filter_complex concat=n=%FilCnt%:v=0:a=1 -vn Output.OGG

इस तरह, आप स्रोत फ़ाइल नामों या कॉनैट-काउंट पैरामीटर से परेशान नहीं होते हैं।


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