लिनक्स में mp4 फाइलें शामिल करें


31

मैं एक बनाने के लिए दो mp4 फाइलों में शामिल होना चाहता हूं। वीडियो स्ट्रीम h264 और aac में ऑडियो एन्कोडेड हैं। मैं कम्प्यूटेशनल कारणों से वीडियो को दूसरे प्रारूप में फिर से एनकोड नहीं कर सकता। इसके अलावा, मैं किसी भी GUI प्रोग्राम का उपयोग नहीं कर सकता, सभी प्रोसेसिंग लिनक्स कमांड लाइन उपयोगिताओं के साथ किया जाना चाहिए। FFmpeg mpeg4 फ़ाइलों के लिए ऐसा नहीं कर सकता, इसलिए मैंने MP4Box का उपयोग किया:

MP4Box -add video1.mp4 -cat video2.mp4 newvideo.mp4

दुर्भाग्य से ऑडियो सब मिश्रित हो जाता है। मैंने सोचा था कि समस्या यह थी कि ऑडियो एएसी में था इसलिए मैंने इसे एमपी 3 में ट्रांसकोड किया और फिर से MP4Box का इस्तेमाल किया। इस मामले में ऑडियो पहले हाफ के लिए ठीक है newvideo.mp4(संबंधित video1.mp4) लेकिन फिर उनका कोई ऑडियो नहीं है और मैं वीडियो में भी नेविगेट नहीं कर सकता।

मेरा अगला विचार यह था कि ऑडियो और वीडियो स्ट्रीम में उनकी लंबाई में कुछ छोटी विसंगतियां थीं, जिन्हें मुझे ठीक करना चाहिए। इसलिए प्रत्येक इनपुट वीडियो के लिए मैंने वीडियो और ऑडियो स्ट्रीम को विभाजित किया और फिर उन्हें FFmpeg में -shortest विकल्प के साथ जोड़ा।

इस प्रकार मेरे द्वारा चलाए गए पहले वीडियो के लिए:

 avconv -y -i video1.mp4 -c copy -map 0:0 videostream1.mp4
 avconv -y -i video1.mp4 -c copy -map 0:1 audiostream1.m4a
 avconv -y -i videostream1.mp4 -i audiostream1.m4a  -c copy -shortest  video1_aligned.mp4

इसी तरह दूसरे वीडियो के लिए और फिर पहले की तरह MP4Box का इस्तेमाल किया। दुर्भाग्य से यह भी काम नहीं किया। एकमात्र सफलता मुझे तब मिली जब मैं वीडियो स्ट्रीम में अलग से शामिल हो गया (यानी videostream1.mp4 और videostream2.mp4) और ऑडियो स्ट्रीम (यानी audiostream1.m4a और audiostream2.m4a) और फिर एक अंतिम फ़ाइल में वीडियो और ऑडियो से जुड़ गया। हालाँकि, वीडियो के दूसरे छमाही के लिए सिंक्रनाइज़ेशन खो जाता है। लगातार, ऑडियो और वीडियो की 1 सेकंड की देरी है। किसी भी सुझाव वास्तव में स्वागत है।


"FFmpeg mpeg4 फ़ाइलों के लिए ऐसा नहीं कर सकता, इसलिए मैंने MP4Box का उपयोग किया" क्या आपका मतलब MP4 फ़ाइल है? दोनों ऑडियो-वीडियो स्ट्रीम समान एन्कोडिंग मापदंडों (चौड़ाई, ऊंचाई, एसपीएस, पीपीएस, फ्रैमरेट, नमूनाकरण, चैनलों की संख्या का उपयोग करते हैं?

ffprobe का उपयोग करते हुए मैं देखता हूं कि ऑडियो स्ट्रीम में समान विशेषताएं हैं। वीडियो स्ट्रीम में समान आयाम हैं लेकिन अलग-अलग दरें हैं। 1 वीडियो के लिए वीडियो: h264, 720x592, 277 kb / s, PAR 18944: 12915 DAR 512: 287, 24.97 fps, 45k tbr, 90k tbn, 90k tbc जबकि दूसरे वीडियो के लिए: h264, 720x592, 226 kb / s, PAR 481: 330 DAR 39:22, 24.91 fps, 45k tbr, 90k tbn, 90k tbc। क्या आप मानते हैं कि यह मेरी समस्याओं का स्रोत है?

MP4 अलग-अलग वीडियो के लिए अलग-अलग ट्रैक का उपयोग करके विभिन्न विशेषताओं के साथ वीडियो / ऑडियो से जुड़ने का समर्थन करता है, लेकिन खिलाड़ी उतना स्मार्ट नहीं है।
रजनीश


: आपका प्रश्न पहले से ही ffmpeg पूछे जाने वाले प्रश्न में उत्तर दिया जाता है ffmpeg.org/faq.html#How-can-I-join-video-files_003f
Palec

जवाबों:


31

वर्तमान में यह करने का सबसे अच्छा तरीका है, कॉनकैट डिमॉक्सर । सबसे पहले, inputs.txtस्वरूपित नामक एक फ़ाइल बनाएं :

file '/path/to/input1.mp4'
file '/path/to/input2.mp4'
file '/path/to/input3.mp4'

फिर, बस इस ffmpeg कमांड को चलाएं:

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

एफएक्यू मेंffmpeg भी देखें ।


मैं ffmpeg के पुराने संस्करणों का उपयोग कर किसी के लाभ के लिए यहाँ निम्नलिखित रख रहा हूँ।

Ffmpeg के नवीनतम संस्करण यह कर सकते हैं: आपको पहले mpeg ट्रांसपोर्ट स्ट्रीम में फ़ाइलों को रिमूव करना होगा (काफी प्रोसेसर-लाइट, क्योंकि यह केवल कंटेनर प्रारूप को बदल रहा है):

ffmpeg -i input.mp4 -map 0 -c copy -f mpegts -bsf h264_mp4toannexb middle.ts

यदि वह h264 के बारे में कोई त्रुटि देता है, तो आपको उपयोग करने की आवश्यकता हो सकती है:

ffmpeg -i input.mp4 -map 0 -c copy -f mpegts -bsf h264_mp4toannexb middle.ts

आपको इसे प्रत्येक इनपुट फ़ाइल के साथ अलग से करना होगा। फ़ाइलों को एक साथ सम्‍मिलित करने के लिए, उपयोग करें:

ffmpeg -i "concat:middle1.ts|middle2.ts|middle3.ts" -c copy output.mp4

यदि वह aac के बारे में कोई त्रुटि देता है, तो आपको उपयोग करने की आवश्यकता हो सकती है

ffmpeg -i "concat:middle1.ts|middle2.ts|middle3.ts" -c copy -absf aac_adtstoasc output.mp4

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

mkfifo temp0 temp1

आपको निम्नलिखित तीन अलग-अलग वर्चुअल टर्मिनलों में करना होगा:

ffmpeg -i input0.mp4 -map 0 -c copy -f mpegts -bsf h264_mp4toannexb -y temp0
ffmpeg -i input1.mp4 -map 0 -c copy -f mpegts -bsf h264_mp4toannexb -y temp1
ffmpeg -f mpegts -i "concat:temp0|temp1" -c copy -absf aac_adtstoasc output.mp4

यदि output.mp4 पहले से मौजूद है, तो तीसरा ffmpeg आपसे पूछेगा कि क्या आप इसे अधिलेखित करना चाहते हैं, लेकिन FIFOs तक पहुँचने के बाद यह ऐसा करेगा , और यह पहले ffmpegs को बंद कर देगा। इसलिए सुनिश्चित करें कि आप अपनी आउटपुट फ़ाइल के लिए अप्रयुक्त नाम का चयन करें।

अगर आपकी इनपुट फाइलें अलग हैं तो यह काम नहीं कर सकता है - मेरा मानना ​​है कि बिट रेट में अंतर ठीक है, लेकिन फ्रेम साइज, फ्रेम रेट आदि का मिलान करना होगा।


कई thx दोस्त, एक आकर्षण की तरह काम किया
जोस आर्मंडो

2
@DaveJarvis ऐसा नहीं है; यह एक संदेश है जो जानबूझकर और दुर्भावनापूर्वक फैले लिबाव टीम द्वारा फैलाया जाता है, जो डेवलपर्स का एक समूह है, जो ffmpeg प्रोजेक्ट से एवोकॉन विकसित करने के लिए अलग हो जाते हैं (और नाम बदल दिया क्योंकि वे ffmpeg नाम पर कॉपीराइट को सुरक्षित नहीं कर सके)। देखें कि कौन मुझे ffmpeg, libav और avconv के बीच अंतर और संबंध बता सकता है? थोड़ी और जानकारी के लिए।
ईविल

2
*** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.एक संदेश है जिसे मैं अब देख रहा हूंffmpeg
भगवान लोह।

@LordLoh। मेरी पिछली टिप्पणी में लिंक देखें।
evilsoup

1
उस उत्तर का उत्तर नहीं है - mp4 को कैसे प्राप्त करेंavconv
भगवान लोह के साथ।

7

Mp4 के लिए एकमात्र कार्यशील समाधान जो मुझे मिला था, gpac पैकेज से MP4Box के साथ था

#!/bin/bash
filesList=""
for file in $(ls *.mp4|sort -n);do
    filesList="$filesList -cat $file"
done
MP4Box $filesList -new merged_files_$(date +%Y%m%d_%H%M%S).mp4

या कमांड है

MP4Box -cat file1.mp4 -cat file2.mp4 -new mergedFile.mp4

मेन्कोडर और एवोकन के साथ मैं इसे काम नहीं कर सका :-(


2

स्क्रिप्ट dvo के लिए धन्यवाद। मेरे लिए यह एक शानदार शुरुआत थी। मुझे नामित पाइपों का उपयोग करने में कोई समस्या नहीं थी इसलिए मैंने इसके बजाय उनका उपयोग करने के लिए स्क्रिप्ट को अनुकूलित किया। साथ ही मैंने इसे उन स्थानों के साथ फ़ाइल नाम के साथ काम करने के लिए तय किया। नामित पाइपों का आउटपुट तब तक "नहीं" जाता है जब तक कि आप उनसे पढ़ना शुरू नहीं करते हैं, इसलिए एवोकव को अंतिम कॉल से पहले और साथ प्रारंभिक रिमूक्स कार्यों की पृष्ठभूमि की आवश्यकता है। इसके अलावा, -c कॉपी का उपयोग करना न भूलें, या आप पूरे लॉट को पुनः एन्कोडिंग करते हैं।

#!/bin/bash
for FILE in "$@"; do
   TAG=$(echo "$FILE" | sed -e s/[^A-Za-z0-9.]/_/g)
   mkfifo $TAG.mp4concatpipe
   avconv -loglevel "quiet" -i "$FILE"  -f mpegts -c copy -bsf h264_mp4toannexb -y $TAG.mp4concatpipe &
   IN=$IN\|$TAG.fifo
done

IN=${IN#\|}
avconv -i concat:$IN -c copy out.mp4
rm *.mp4concatpipe

किसी कारण से यह मुझे एक "कॉनसैट: first.m4v.fifo | दूसरा m.m4v.fifo: ऐसी कोई फ़ाइल या निर्देशिका" त्रुटि नहीं दे रहा है .. यहां तक ​​कि उद्धरणों के साथ भी (-i concat: "$ IN" या -i "कॉनसैट" $ में ")। MP4Box नीचे दिए गए अन्य उत्तर में सुझाव दिया है, हालांकि महान काम करता है!
vorburger

2

एक मैक (macOS 10.13 हाई सिएरा) पर मैंने सफलता के साथ निम्नलिखित प्रयोग किया:

for f in *.m4a; do echo "file '$f'" >> mylist.txt; done

यदि आवश्यक हो तो समान रूप से ऊपर के रूप में पुन: व्यवस्थित करें (ध्यान दें कि ./ हटा दिया गया था - रास्ता असुरक्षित फ़ाइल नाम त्रुटि को फेंकने के लिए ffmpeg पैदा कर रहा था)।

तो मुझे यह पसंद करने के लिए डिफ़ॉल्ट MacPorts ffmpeg के लिए निर्दिष्ट कोडेक और बिटरेट को हटाना पड़ा:

ffmpeg -f concat -i mylist.txt  output.m4a

सुपर उपयोगकर्ता में आपका स्वागत है!, कृपया प्रश्न को फिर से ध्यान से पढ़ें। आपका उत्तर मूल प्रश्न का उत्तर नहीं देता है जो कि लिनक्स के बारे में था। यदि आप मानते हैं कि यह लिनक्स पर काम करेगा तो कृपया यह जोड़ें कि भविष्य के पाठकों को एक स्पष्ट समझ है, इसके अलावा फिर से आपके इनपुट के लिए सुपरयुसर और थैंक्यू का स्वागत है। कृपया कुछ मिनट और पढ़ें: - superuser.com/help .Answering: superuser.com/help/how-to-answer
mic84

2

यहाँ एक लाइनर है जो इसे इतना आसान बनाता है। यह एक परिणामी वीडियो फ़ाइल के साथ अंत में आपको प्रदान करने के लिए आवश्यक सब कुछ करता है। चीयर्स!

find *.mp4 | sed 's:\ :\\\ :g'| sed 's/^/file /' > list.txt; ffmpeg -f concat -i list.txt -c copy output.mp4; rm list.txts

1

धन्यवाद बुराइयों; यहाँ प्रक्रिया को स्वचालित करने के लिए थोड़ी स्क्रिप्ट है, अधिक हाल ही में उपयोग करते हुए avconv
बीटीडब्ल्यू, नामित पाइप मेरे लिए काम नहीं करता था (आउटपुट उन्हें फंस गया)।

   #!/bin/bash

    for FILE in $@; do
      avconv -i $FILE -map 0 -f mpegts -bsf h264_mp4toannexb -c:v copy -y $FILE.tmp
      IN=$IN\|$FILE.tmp
    done

    IN=${IN#\|}
    avconv -i concat:"$IN" out.mp4

    for FILE in $@; do
      rm $FILE.tmp
    done

0

के साथ बड़ी सफलता मिली है

for f in ./*.m4a; do echo "file '$f'" >> mylist.txt; done

आपको थोड़ा सा mylist.txt को पुनः व्यवस्थित करने की आवश्यकता हो सकती है

ffmpeg -f concat -i mylist.txt -c:a libfdk_aac -b:a 128k output.m4a

ffmpeg संस्करण 2.2.3

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