पाठ उपशीर्षक जोड़ने के लिए ffmpeg का उपयोग करें [बंद]


122

मैं ffmpeg का उपयोग करके एक .mp4 कंटेनर में पाठ उपशीर्षक जोड़ने की कोशिश कर रहा हूं:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mp4

जब मैं इस लाइन को चलाने की कोशिश कर रहा हूं, तो यह मुझे एक त्रुटि देता है:

स्ट्रीम स्ट्रीम के नक्शों को आउटपुट स्ट्रीम की संख्या से मेल खाना चाहिए।

अगर मैं mp4 को mkv में बदलने की कोशिश करूँ (हालाँकि mp4 पाठ उपशीर्षक का समर्थन करता है), इस तरह:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mkv

यह धाराओं को सही ढंग से मैप करता है, लेकिन एक त्रुटि देता है:

एनकोडर (कोडेक आईडी 94210) आउटपुट स्ट्रीम # 0.2 के लिए नहीं मिला

जब मैं लॉन्च करता हूं

ffmpeg -codecs

मैं देख सकता हूं कि srt कोडेक डिकोडर और एनकोडर के रूप में समर्थित है, हालांकि मुझे यकीन नहीं है कि mp4 और mkv सबको एन्कोडिंग के लिए क्या उपयोग किया जाता है, और क्या मुझे इसे अलग से स्विच करने या संकलित करने की आवश्यकता है।

जवाबों:


196
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4

-vf subtitles=infile.srt साथ काम नहीं करेगा -c copy


का क्रम -c copy -c:s mov_textमहत्वपूर्ण है। आप FFmpeg बता रहे हैं:

  1. वीडियो: कॉपी, ऑडियो: कॉपी, उपशीर्षक: कॉपी
  2. उपशीर्षक: mov_text

यदि आप उन्हें उल्टा करते हैं, तो आप FFmpeg बता रहे हैं:

  1. उपशीर्षक: mov_text
  2. वीडियो: कॉपी, ऑडियो: कॉपी, उपशीर्षक: कॉपी

वैकल्पिक रूप से आप -c:v copy -c:a copy -c:s mov_textकिसी भी क्रम में उपयोग कर सकते हैं ।


13
इस पद्धति में धारा में से एक के रूप में फाइल करने के लिए उपशीर्षक जोड़ें, इसलिए उपशीर्षक (जैसे VLC) दिखाने के लिए खिलाड़ी के समर्थन की आवश्यकता है
BollMose

1
इसका मतलब यह है कि उपशीर्षक उपलब्ध है, लेकिन वीडियो में जला नहीं है? मैं मांगने पर दिखा सकता हूं?
सूर्य

3
हां @ sunk818 यही इसका मतलब है। यह उपशीर्षक को एक ट्रैक के रूप में जोड़ता है जिसे तब तक सक्षम या अक्षम किया जा सकता है जब तक खिलाड़ी इसका समर्थन करता है। श्री हाइड और पॉल ffmpeg वीडियो के सबटाइट ऑनटॉप को भी जोड़ सकते हैं, और उन मामलों में आप फ़ॉन्ट और स्थिति जैसी चीजों को नियंत्रित करेंगे।
17

1
.srt फ़ाइलों को -c:s copyनहीं के साथ आयात किया जाना चाहिए -c:s mov_text
GetFree

82

नोट: यह समाधान वीडियो में "उपशीर्षक को जलता है", ताकि वीडियो के प्रत्येक दर्शक उन्हें देखने के लिए मजबूर हो जाए।

libassपुस्तकालय का उपयोग करें (सुनिश्चित करें कि आपके ffmpeg स्थापित के पास विन्यास में पुस्तकालय है --enable-libass)।

सबसे पहले उपशीर्षक को .assप्रारूप में बदलें:

ffmpeg -i subtitles.srt subtitles.ass

फिर उन्हें एक वीडियो फ़िल्टर का उपयोग करके जोड़ें:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4

40
यह वीडियो में "उन्हें जला देगा", जिसका अर्थ है कि आप उन्हें खिलाड़ी में बंद नहीं कर सकते। यह उन्हें एक उपशीर्षक स्ट्रीम के रूप में जोड़ने के लिए अलग है जिसे खिलाड़ी द्वारा पढ़ा जा सकता है और प्रदर्शित किया जा सकता है यदि दर्शक उन्हें चाहता है।
stib

1
इस समाधान के लिए बहुत बहुत धन्यवाद। पात्रों के आकार को निर्दिष्ट करने के लिए वैसे भी क्या है?
user1319182

1
इस उत्तर पर एक नज़र डालें: stackoverflow.com/questions/21363334/… । आप शायद उपशीर्षक फ़ाइल में फ़ॉन्ट सेट करना चाहते हैं, अन्यथा उपशीर्षक फ़िल्टर का उपयोग करके, आप फ़ॉन्ट सेट करने के लिए मजबूर कर सकते हैं: ffmpeg.org/ffmpeg-filters.html#subtmarks-1
HdN8

इंस्टाग्राम जैसे वीडियो के लिए सबटाइटल जोड़ते समय यह उपयोगी होगा। कहीं न कहीं इंस्टाग्राम दर्शक को लगता है कि उपयोगकर्ता के पास ध्वनि या वीडियो सुनने की कोई क्षमता नहीं है, तब उपयोगकर्ता इसके बजाय उपशीर्षक पढ़ सकता है
insteadα --О-MaMrEzO

1
libassएक्सटेंशन सेट करें यदि डेब्ट सिस्टम पर 'apt update && apt install libass-dev' के साथ
गुम है

53

उपशीर्षक के रूप में उपशीर्षक को मिटाने के लिए आप कोशिश कर रहे हैं। यह आसान है लेकिन MP4 (या M4V) और MKV के लिए अलग-अलग वाक्यविन्यास का उपयोग किया जाता है। यदि आप केवल उपशीर्षक जोड़ना चाहते हैं, तो दोनों ही मामलों में आपको वीडियो और ऑडियो कोडेक निर्दिष्ट करना चाहिए, या स्ट्रीम कॉपी करना चाहिए।

MP4:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s mov_text output.mp4

MKV:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s srt  output.mkv

3
क्या एक से अधिक उपशीर्षक जोड़ना संभव है? क्या इस सोफट्सब को भाषा अज्ञात के रूप में मान्यता दी जाएगी?
पैट्रिक

1
हाँ यही है। मैंने इसे केवल MKV के लिए परीक्षण किया है:
डॉटोकिजा

7
सबसे पहले एक और इनपुट जोड़ें: -i input2.srt। दूसरा, कि 2 धारा के रूप में नक्शा: -मैप 2: 0। अंत में, 2 उपशीर्षक स्ट्रीम (पहले वाले के समान) के लिए एनकोडर का चयन करें: -c: s srt। पूरा उदाहरण \ ffmpeg -i input.mp4 -f srt -i input.srt -i input2.srt \ -map 0: 0 -map 0: 1 -map 1: 0 -map 2: 0 -c: यह प्रति c: a copy \ -c: s srt -c: s srt output.mkv
dotokija

8
और भाषा मेटाडेटा जोड़ने के लिए (आउटपुट फ़ाइल से पहले सम्मिलित करें) "-मेटाडाटा: s: s: 0 भाषा = eng"
पैट्रिक

मूल फ़ाइल में उपशीर्षक कैसे आता है, जब मुझे mp4 फ़ाइलों के रूप में "rewrap" mkv फ़ाइलों को छोड़ दिया जाता है (ffmpeg -i film.mkv -vcodec copy -acodec copy film.mp4) ?? मूल mkv में सबटाइटल है लेकिन mp4 फॉर्मेट में आउटपुट नहीं है। क्या चल रहा है? मैं सही ढंग से क्या नहीं कर रहा हूँ?
ओल्डबॉय

9

MKV कंटेनर वीडियो और ऑडियो कोड को लगभग किसी भी चीज़ का समर्थन करता है और उपशीर्षक और डीवीडी मेनू का भी समर्थन करता है। तो आप बस उपशीर्षक वीडियो से आउटपुट वीडियो से MKV कंटेनर के साथ उपशीर्षक के साथ कॉपी कर सकते हैं। पहले आपको एसआरटी को एएसएस उपशीर्षक प्रारूप में बदलना चाहिए

ffmpeg -i input.srt input.ass

और ASS उपशीर्षक को वीडियो में एम्बेड करें

ffmpeg -i input.mp4 -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

VMW फ़ाइल के साथ भी काम किया है।

ffmpeg -i input.wmv -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

विकी पृष्ठ देखें कंटेनर कंटेनरों की तुलना


1
एचवी वास्तव में प्रासंगिक नहीं है, यह हमेशा एक से अधिक समाधान देखने के लिए स्वागत है।
जेसनएक्सए

8

ffmpeg mov_textसबटाइटल एनकोडर का समर्थन करता है जो कि एक MP4 कंटेनर में समर्थित केवल एक के बारे में है और iTunes, क्विक, iOS आदि द्वारा चलाया जा सकता है।

आपकी पंक्ति पढ़ी जाएगी:

ffmpeg -i input.mp4 -i input.srt -map 0:0 -map 0:1 -map 1:0 -c:s mov_text output.mp4


5

मैंने इस कार्य के लिए MP4Box का उपयोग करने की कोशिश की, लेकिन यह उस M4V को नहीं संभाल सका जिसके साथ मैं काम कर रहा था। मुझे निम्नलिखित कमांड लाइन के साथ ffmpeg के साथ SRT को सॉफ्ट उपशीर्षक के रूप में एम्बेड करने में सफलता मिली:

ffmpeg -i input.m4v -i input.srt -vcodec copy -acodec copy -scodec copy -map 0:0 -map 0:1 -map 1:0 -y output.mkv

आपकी तरह मुझे भी MKV आउटपुट फ़ाइल का उपयोग करना था - मैं M4V फ़ाइल बनाने में सक्षम नहीं था।


3

मैं एक साधारण और सामान्य जवाब है कि ऑडियो और के किसी भी संख्या के साथ काम करता प्रदान करेगा srt उपशीर्षक और सम्मान मेटाडाटा कि शामिल हो सकते हैं MKV कंटेनर। तो यह उन चित्रों को भी जोड़ेगा जिनमें मैट्रोका संलग्नक के रूप में शामिल हो सकता है (हालांकि अन्य प्रकार के AFAIK नहीं) और उन्हें पटरियों में परिवर्तित कर सकता है; आप देख नहीं पाएंगे, लेकिन वे वहां मौजूद रहेंगे (आप उन्हें हटा सकते हैं)। आह, और अगर mkv में mp4 भी अध्याय है।

ffmpeg -i <mkv-input> -c copy -map 0 -c:s mov_text <mp4-output>

जैसा कि आप देख सकते हैं, यह सब के बारे में है -map 0, जो सभी पटरियों को जोड़ने के लिए FFmpeg को बताता है , जिसमें मेटाडेटा, अध्याय, अटैचमेंट आदि शामिल हैं। अगर कोई अपरिचित "ट्रैक" है ( mkv किसी भी प्रकार की फ़ाइल संलग्न करने की अनुमति देता है ), तो यह होगा। एक त्रुटि के साथ अंत।

आप एक साधारण बैच बना सकते हैं mkv2mp4.bat, यदि आप आमतौर पर ऐसा करते हैं, तो mkv के समान नाम के साथ एक mp4 बनाने के लिए । यह त्रुटि नियंत्रण, एक अलग आउटपुट नाम, आदि के साथ बेहतर होगा, लेकिन आप बिंदु प्राप्त करते हैं।

@ffmpeg -i %1 -c copy -map 0 -c:s mov_text "%~n1.mp4"

अब आप बस चला सकते हैं

mkv2mp4 "Video with subtitles etc.mkv"

और यह "वीडियो के साथ उपशीर्षक आदि .mp4" को शामिल करेगा जिसमें अधिकतम जानकारी शामिल होगी।


-1

सरल उदाहरण:

videoSource=test.mp4
videoEncoded=test2.mp4
videoSubtitle=test.srt
videoFontSize=24
ffmpeg -i "$videoSource" -vf subtitles="$videoSubtitle":force_style='Fontsize="$videoFontSize"' "$videoEncoded"

केवल लिनक्स वेरिएबल्स को बदलें


विस्तृत करने के लिए परवाह?
रामेनशेफ

-3

यही कारण है कि mkv इतना अच्छा कंटेनर है, खासकर अब जब यह परिपक्व है:

mkvmerge -o output.mkv video.mp4 subtitle.srt

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