Ubuntu पर कई (दो से अधिक) वीडियो कैसे मर्ज करें?


38

मैं बीस (20) प्रत्येक के बैच आकार में वीडियो मर्ज करना चाहता हूं। मैं एक लिनक्स मशीन चला रहा हूँ। वीडियो mp4 प्रारूप और मध्यम गुणवत्ता में हैं। कुछ में ऑडियो स्ट्रीम भी गायब है। अब तक मैं कोशिश की है ffmpeg, mencoder, cvlc/vlcऔर MP4Box। मैं इसे हासिल करने के लिए कमांड लाइन स्क्रिप्ट लिखना चाहता हूं, क्योंकि मैं बैच प्रोसेसिंग कर रहा हूं।

मुख्य मुद्दा यह है कि कुछ समाधान मैंने दो वीडियो के लिए अच्छी तरह से काम करने की कोशिश की, कुछ ऑडियो स्ट्रीम के साथ वीडियो के लिए अच्छी तरह से काम करते हैं और फिर भी अन्य मेरे वीडियो सेट के कुछ अन्य सबसेट के लिए अच्छी तरह से काम करते हैं। हालांकि, मैं इस कार्य के लिए एक व्यापक समाधान खोजने में सक्षम नहीं हूं।


2
कृपया मल्टी एसई साइटों में एक ही सवाल न करें: superuser.com/questions/928548/…
Maythux

क्या आप विशेष रूप से पोस्ट कर सकते हैं जो आपने अब तक कोशिश की है?
ओम

1
@ohaal मैंने ffmpegफिल्टर और फ़ाइल प्रोटोकॉल सहित विभिन्न कॉन्सेप्टन तरीकों का उपयोग करने की कोशिश की । मैंने भी की concatसुविधा का उपयोग करने की कोशिश की cvlc/vlc। का concatफीचर भी मैंने आजमाया mencoder। इन सभी ने आंशिक रूप से काम किया। इससे आखिरकार मुझे मामले को सुलझाने में मदद मिली।
ध्रुव सिंगल

हां, आपने पहले ही टूल का उल्लेख किया है, मेरा मतलब था कि आपके द्वारा चलाए गए वास्तविक कमांड थे। इसके अलावा, यह बहुत अच्छा होगा यदि आप उस कमांड को शामिल कर सकते हैं जो भविष्य के आगंतुकों के लिए आपके लिए (आपके उत्तर में) हल कर रहा है।
ओहल

आह, मैं आपकी बात देख रहा हूं। दुर्भाग्य से, मैं सरासर संख्या के कारण आदेशों को सूचीबद्ध नहीं कर सकता। मेरी समस्या का हल करने वाली कमान यह थीmelt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
ध्रुव सिंगल

जवाबों:


41

मैं एक में mkvmergeकई MP4 फ़ाइलों में शामिल होने का उपयोग कर रहा हूँ :

mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4

3
.mkvआउटपुट फ़ाइल के लिए एक्सटेंशन का उपयोग करना बेहतर है , क्योंकि यह एक Matroska कंटेनर है चाहे आप जो भी एक्सटेंशन दें।
haridsv

यहाँ स्थापित करने का तरीका बताया गया है mkvmerge: tipsonubuntu.com
Morgoth

केवल यह कमांड mkvmerge काम करता है। कम से कम स्थानांतरित ऑडियो के साथ सभी ffmpeg वाले विफल होते हैं।
42n4

25

आप इसका उपयोग कर सकते हैं ffmpeg:

ffmpeg -i concat:"input1.mp4|input2.mp4" output.mp4

संदर्भ और अधिक जानकारी


2
मैंने ऐसा करने की कोशिश की। इस के साथ मुद्दा यह है कि यह एक उचित बाहर नहीं देता है। 1. ऑडियो ट्रैक्स को मैड किया जाता है। 2. वीडियो ट्रैक में कुछ गड़बड़ी है।
ध्रुव सिंगल

मैंने इसे नमूना से अधिक के लिए उपयोग किया, परिणाम उच्च गुणवत्ता वाला है, शायद आपके स्रोत वीडियो की गुणवत्ता समस्या है?
मेयथक्स

शायद आप सही हैं। इससे यह समस्या हल हो गई: askubuntu.com/a/637179/420614
ध्रुव सिंगल

2
MP4 करने के लिए कॉनकैट प्रोटोकॉल का उपयोग न करें। यह केवल कुछ प्रारूपों के साथ काम करता है जो अधिकांश सामान्य उपयोगकर्ताओं का सामना नहीं करते हैं। का प्रयोग करें concat demuxer या concat फिल्टर बजाय।
११

मैं 30 मिनट प्रत्येक के 2 mp4 फ़ाइलों के साथ ffmpeg की कोशिश की। मुझे 7 घंटे की लंबाई के साथ एक आउटपुट फ़ाइल मिली।
ग्यूस

7

इससे मामला सुलझ गया: https://stackoverflow.com/a/22324018/5014767

meltइसके लिए एक महान कमांड लाइन उपयोगिता है। यहाँ पृष्ठ है

टिप्पणियों से संपादित करें: कमांड जिसने मेरी समस्या हल की थी वह थी melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264


4

मैं ffmpeg का उपयोग कर transcoding के बिना MP4s को समेटने के लिए एक छोटी सी शेल स्क्रिप्ट लिखी।

for f in $(ls *.MP4); do
    ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
done

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")

ffmpeg -i "concat:$CONCAT" -c copy -bsf:a aac_adtstoasc output.mp4

rm *.ts

यह एक एमपीईजी कंटेनर में मध्यवर्ती फाइलें बनाता है और फिर उन्हें एक MP4 में मिलाता है।


यह नोट करना महत्वपूर्ण है कि यह स्क्रिप्ट विफल हो जाएगी यदि किसी भी फ़ाइल नाम में स्थान है या, कुछ मामलों में, विशेष वर्ण हैं। लूप के लिए, इसका उपयोग for f in *.MP4किए बिना उपयोग करना बेहतर है ls। (आपको lsकुछ महत्वपूर्ण कारणों से लिपियों में उपयोग करने से हमेशा बचना चाहिए ; बेहतर विकल्प हैं।) इसके अलावा, चर के लिए उद्धरणों का उपयोग करें जब तक कि आप निश्चित नहीं हैं कि रिक्त स्थान या अन्य विशेष वर्ण नहीं हैं, इसलिए "${f}"(या सिर्फ "$f") बिना पढ़े हुए के बजाय $f
धान लैंडौ

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")1, 2, 3 ... 10 ... 20 फ़ाइल नाम के साथ अच्छी तरह से काम नहीं करता है। यह 1, 10 ... 2, 20 ... आदि के रूप में उन्हें समाप्त करता है। मेरा सुझाव है कि CONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")यह आदेश सुनिश्चित करेगा। ।
टिस्कॉनुंड्रम

2

एक फ़ाइल फ़ाइल बनाएँ। उन सभी फ़ाइलों के साथ, जिन्हें आप निम्नलिखित रूप में संक्षिप्त करना चाहते हैं (एक # के साथ शुरू होने वाली पंक्तियाँ):

# this is a comment
file 'file1.mp4'
file '/path/to/file2.mp4'
file 'file3.mp4'

ध्यान दें कि ये या तो सापेक्ष या पूर्ण पथ हो सकते हैं। तब आप अपनी फ़ाइलों को कॉपी या फिर से एनकोड कर सकते हैं:

ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4

0

मेरी स्क्रिप्ट, विशुद्ध रूप से bashऔर में ffmpeg। कमांड लाइन पर दी गई फाइलों को एक में फिर से एनकोड करता है।

फ़ाइलों को एक ही रिज़ॉल्यूशन का होना चाहिए। विभिन्न मेटाडेटा रोटेशन को स्वीकार ffmpeg concat:करता है , जो नहीं करता है।

rm ffmpeg-concat-output.mkv

FILE_COUNT=$#
INPUTS=""
FILTER=""
INDEX=0
for FNAME in $@; do
    echo "Processing ${FNAME}"
    INPUTS="${INPUTS} -i $FNAME"

    if [ -z "${FILTER}" ]; then
        FILTER="[$INDEX:v:0] [$INDEX:a:0]"
    else
        FILTER="${FILTER} [$INDEX:v:0] [$INDEX:a:0]"
    fi
    let INDEX+=1
done

COMMAND="ffmpeg ${INPUTS} \
    -filter_complex '${FILTER} \
        concat=n=${INDEX}:v=1:a=1 [v] [a]' \
    -map '[v]' -map '[a]' \
    ffmpeg-concat-output.mkv"

#   -af 'volume=15dB' # won't work with -filter_complex

bash -c "${COMMAND}"

0

मैंने एक पायथन लिपि बनाई , जिसमें मूवीपी का उपयोग करते हुए , अवचेतन को भी समाहित किया जा सकता है (उपयोगी यदि आप उदाहरण के लिए एक वीडियो से कुछ हिस्सों को हटाना चाहते हैं)।

इसके साथ प्रयोग करें:

vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>

-1

मेथक्स के जवाब के अलावा, से :

कुछ मल्टीमीडिया कंटेनरों (एमपीईजी -1, एमपीईजी -2 पीएस, डीवी) में से किसी एक को वीडियो को केवल उन फ़ाइलों को संक्षिप्त करने के लिए अनुमति देता है।

अर्थात्, उपर्युक्त वीडियो कंटेनरों में से एक का उपयोग करने के लिए वीडियो (जिसमें मैं व्यक्तिगत अनुभव के लिए MPEG-4 भाग 14 जोड़ूंगा), आप बस कर सकते हैं:

cat video1.ext video2.ext video3.ext > video4.ext

1
मैंने यह कोशिश की लेकिन यह केवल आउटपुट के रूप में पहला वीडियो देता है। मैंने कहीं पढ़ा है कि यह काम नहीं करता है, हालांकि मुझे इसके पीछे तर्क याद नहीं है।
ध्रुव सिंगल

@ ध्रुवसिंगल हां, मैं इसकी पुष्टि कर सकता हूं, मैंने दो MP4 वीडियो पर सटीक एक ही वीडियो / ऑडियो एन्कोडिंग के साथ कोशिश की है और जैसा कि आप केवल पहले वीडियो के माध्यम से ब्राउज़ कर सकते हैं। जो उचित लगता है, हालांकि मुझे पूरा यकीन है कि मैंने एक बार पहले MP4 वीडियो के साथ ऐसा किया है। शायद स्मृति यहाँ अच्छी तरह से सेवा नहीं कर रही है, या इसके लिए काम करने के लिए अन्य आवश्यकताएं हैं। मैं इस पर शोध करना चाहता हूं क्योंकि मुझे भी दिलचस्पी है, अगर मुझे कुछ मिला तो मैं जवाब को अपडेट करूंगा और आपको एक टिप्पणी छोड़ दूंगा
kos

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