Ffmpeg -map कमांड को समझने में परेशानी हो रही है


3

मैं एक mkv कंटेनर से mp4 में वीडियो / ऑडियो कॉपी करने की कोशिश कर रहा हूं। जब मैं चलाता ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4हूं तो मुझे पॉलिश ऑडियो के साथ कोई वीडियो नहीं दिया जाता है। केवल एक वीडियो स्ट्रीम है, # 0: 0 स्ट्रीम। स्ट्रीम # 0: 1 पॉलिश ऑडियो है, # 0: 2 अंग्रेजी, और # 0: 3 - # 0: 5 उपशीर्षक हैं।

मैंने इसे https://trac.ffmpeg.org/wiki/How%20to%20use%20-map%20option पढ़ा, लेकिन इसे वास्तव में नहीं समझा। उदाहरण में 1 को दो बार क्यों लिखा जाता है 0: 1? क्या करता है -c: s करते हैं? # 0: 0 से वीडियो और # 0: 2 को ऑडियो की तरह कॉपी करने के लिए क्या कमांड होगी?

जवाबों:


6

-map <inputNo>:<streamNo>ffmpeg बताता धारा लेने के लिए streamNo इनपुट से inputNo और उत्पादन है, जहां में जोड़ने के लिए <inputNo>0 के साथ शुरू होता है।

कभी-कभी, आप एक ही इनपुट स्ट्रीम को दो बार ( -map 0:1 -map 0:1उदाहरण के रूप में) लेना चाह सकते हैं क्योंकि आप प्रत्येक को अलग-अलग कोडेक्स / पैरामीटर के साथ एन्कोड कर सकते हैं। उदाहरण में, आउटपुट में एक ही ऑडियो स्ट्रीम दो बार, एक MP3 में और दूसरा AAC में है।

डिफ़ॉल्ट रूप से (अर्थात बिना किसी -mapकमांड के), एक वीडियो, एक ऑडियो और इनपुट से एक सबटाइटल स्ट्रीम ली जाती है। यदि आप एक इनपुट से सभी स्ट्रीम मैप करना चाहते हैं, तो उपयोग करें -map <inputNo>

आपको अपने आदेश के साथ वीडियो नहीं मिलता है, इसका केवल एक ही मतलब हो सकता है: आपका वीडियो ट्रैक एक कोडेक से एन्कोडेड है जिसे MKV में muxed किया जा सकता है, लेकिन MP4 में नहीं। तो यह स्वचालित रूप से खारिज कर दिया जाता है। क्या आप एक लॉग पोस्ट कर सकते हैं ffmpeg -i input.mkvताकि हम यह जांच सकें कि कौन से कोडेक्स पटरियों से एन्कोड किए गए हैं?

अंत में, -c:sउपशीर्षक कोडेक के लिए प्रयोग किया जाता है (जबकि -c:aऑडियो और -c:vवीडियो के लिए)


2
"डिफ़ॉल्ट रूप से (यानी बिना -मैप कमांड के साथ), सभी इनपुट से सभी स्ट्रीम एक बार ली जाती हैं।" - यह सच नहीं है। ffmpeg केवल एक ऑडियो, वीडियो और उपशीर्षक स्ट्रीम लेगा । यदि आप सभी धाराओं को मैप करना चाहते हैं, तो आपको जरूरत है -map 0
19'15

2

यह वह उदाहरण था जिसने मुझे समझने की अनुमति दी। निम्नलिखित आदेश की कल्पना करें:

ffmpeg -i tears_of_steel.mkv -map 0:0 -map 0:2 -map 0:1 -map 0:4 -map 0:3 -c copy tears_of_steel-v2.mkv 

और यहाँ है कि कैसे ffmpeg मैपिंग करता है:

Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:2 -> #0:1 (copy)
Stream #0:1 -> #0:2 (copy)
Stream #0:4 -> #0:3 (copy)
Stream #0:3 -> #0:4 (copy)

क्या हुआ?

कमांड में, हमारे पास केवल एक इनपुट है: tears_of_steel.mkv। यही कारण है कि हमारे सभी मानचित्र # 0 से शुरू होते हैं: ...

फिर हम एक पहला नक्शा विकल्प लिखते हैं: -मैप 0: 0, जो हमारे इनपुट (tears_of_steel.mkv) की पहली स्ट्रीम को संदर्भित करता है, जो एक वीडियो स्ट्रीम हो सकता है, लेकिन यह कोई फर्क नहीं पड़ता।

क्योंकि यह पहला मानचित्र विकल्प है, इसे हमारी आउटपुट फ़ाइल (tears_of_steel-v2.mkv) में पहली स्ट्रीम में मैप किया जाएगा।

फिर हम एक दूसरा नक्शा विकल्प लिखते हैं: -मैप 0: 2, जो हमारे इनपुट की तीसरी धारा को संदर्भित करता है। क्योंकि यह दूसरा मैप विकल्प है, यह हमारे आउटपुट में दूसरी स्ट्रीम में मैप किया जाता है।

और इसी तरह...

मैंने लिखा है कि मेरे github पर: https://github.com/lingtalfi/ffmpeg-notes/blob/master/ffmpeg-map.md


0

यह काम करना चाहिए, इस मशीन पर परीक्षण नहीं कर सकते:

ffmpeg -i input.mkv
-map 0:0 -map 0:2 \
-c:v copy \
-c:a aac \
-b:a 128k \
output.mp4

या

ffmpeg -i input.mkv -map 0:0 -map 0:2 -c:v copy -c:a aac -b:a 128k output.mp4

स्पष्टीकरण

c: s एक उपनाम के लिए -scodec कोडेक है, जो उपशीर्षक कोडेक को निर्दिष्ट करता है।

-मैप 0: 1 दो बार होता है क्योंकि उदाहरण में एक एएसी और एक एमपी आउटपुट होता है।


काम नहीं करेगा क्योंकि -c:a aacजरूरतें -strict experimentalभी हैं।
slhck

0

यह मेरे जैसे लोगों के लिए एक सरल उत्तर है, जो सरल कार्य स्पष्टीकरण पसंद करते हैं। यह एक समाधान है जब आप mp4 को mkv कॉपी करते हैं और ऑडियो स्ट्रीम चुनना चाहते हैं :

आपको लिखना होगा -map 0: संख्या- सामने की संख्या: -एक प्रति

मान लीजिए कि वीडियो में 3 धाराएँ हैं (आप मध्ययुगीन में देख सकते हैं)। पहली स्ट्रीम वीडियो है, दूसरी डिफ़ॉल्ट ऑडियो है, और तीसरी आप जो भाषा चाहते हैं उसमें गैर-डिफ़ॉल्ट ऑडियो है। इसलिए आपको 0: 2 NOT -map 0: 3 लिखना होगा

इसके अलावा, आपको -c: -c: v कॉपी के सामने 0: 0 लिखना होगा क्योंकि यदि आप नहीं करते हैं, तो ffmpeg वीडियो स्ट्रीम को कॉपी नहीं करेगा और आपको केवल ऑडियो स्ट्रीम मिलती है (यदि वीडियो में दो वीडियो स्ट्रीम हैं और आप दूसरे को कॉपी करना चाहते हैं, आपको लिखना होगा -मैप 0: 1)

तो अंतिम कमांड लाइन इस तरह दिखती है:

ffmpeg -i "inputpath\input.mkv" -map 0:0 -c:v copy -map 0:2 -c:a copy "outputpath\output.mp4"

इस स्थिति में, आपको पहला वीडियो स्ट्रीम और तीसरा ऑडियो स्ट्रीम मिलेगा

एक और उदाहरण:

ffmpeg -i "inputpath\input.mkv" -map 0:1 -c:v copy -map 0:6 -c:a copy "outputpath\output.mp4"

इस मामले में आपको दूसरी वीडियो स्ट्रीम और सातवीं ऑडियो स्ट्रीम मिलनी चाहिए

आशा है कि ये आपकी मदद करेगा


उदाहरण गलत लगते हैं, या शब्दांकन भ्रामक है। जैसा कि मैं इसे समझता हूं, "0: 2", तीसरी धारा को संदर्भित करता है, इसके प्रकार की परवाह किए बिना, इसलिए सबसे अधिक संभावना है कि दूसरी ऑडियो स्ट्रीम (यदि केवल एक वीडियो स्ट्रीम है और स्ट्रीम इनपुट में "तार्किक" क्रम में रखी गई हैं) ; इसी तरह, दूसरे उदाहरण में, "0: 6" छठा ऑडियो स्ट्रीम होगा यदि धारा 0 इनपुट में वीडियो स्ट्रीम है और 1-6 ऑडियो स्ट्रीम हैं।
गैब्रियलबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.