ffmpeg के साथ वीडियो (ऑडियो) की सटीक कटिंग


10

मैं चाहता हूं कि मेरी वेबसाइट उपयोगकर्ताओं को मेरे द्वारा प्रदान की जाने वाली स्रोत वीडियो से अपनी क्लिप बनाने की अनुमति दे।

मेरे पास एक स्रोत वीडियो फ़ाइल है जिसे मैं पहली बार किसी वेबसाइट के लिए उपयुक्त चीज़ में बदलना चाहता हूँ:

Input #0, matroska,webm, from 'source.mkv': 
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s 
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)

मैं इसे बदलने के लिए ffmpeg का उपयोग करता हूं:

ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4

इस वीडियो को वापस देखते हुए यह मेरी आवश्यकताओं के लिए अच्छी गुणवत्ता और छोटे फ़ाइल आकार के लिए पर्याप्त है, और मेरी वेबसाइट पर लोड / निभाता है।

मेरे पास एक वेबपेज है जो उपयोगकर्ताओं को इस वीडियो पर एक शुरुआत और समापन बिंदु का चयन करने देता है - और एक क्लिप बनाता है। यहाँ ffmpeg कमांड का एक उदाहरण दिया गया है जिसका उपयोग मैं उसके लिए करता हूँ:

-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4

समस्या यह है कि क्लिप हमेशा पर्याप्त समय-सटीक नहीं होती है। आमतौर पर ऑडियो काफी सटीक होता है, लेकिन वीडियो आधा सेकंड पहले या कुछ और बंद हो जाता है।

क्या यह कहने का कोई सटीक और इन-सिंक बनाने का कोई तरीका है, एक सेकंड का 0.2?

संपादित करें: जोड़ना -force_key_frames 00:00:00.2मदद नहीं की।

संपादित करें: मैंने अच्छे (ईश) परिणामों के -c:v libx264 -c:a aac -strict experimentalबजाय उपयोग करने के लिए क्लिपिंग को बदल दिया -codec:v copy -codec:a copy

फ़ाइल बिना किसी समस्या के बाहरी रूप से खेल सकती है - लेकिन जब मैं इसे अपने html5 वीडियो तत्व में लोड करता हूं और इसे खेलता हूं - वीडियो का अंतिम भाग (ऑडियो ठीक है) जमा देता है। अंतिम भाग जो जमा देता है वह एक दूसरे लंबे समय से कम है।

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

लेकिन इस तथ्य पर लटका नहीं है कि यह एमपीसी या विंडोज मीडिया प्लेयर जैसे खिलाड़ी के साथ समस्या के बिना सटीक रूप से खेलता है, यह बताता है कि यह Google क्रोम या HTML वीडियो तत्व के साथ एक समस्या है? या मैं एक असमर्थित एन्कोडिंग या कुछ का उपयोग कर रहा हूँ?


यह मुख्य फ्रेम के समय के साथ करना पड़ सकता है। किसी भी स्थिति में, इसे SuperUser.com पर स्थानांतरित किया जाना चाहिए।
ब्रैड

नमस्ते, ffmpeg किसी भी बिंदु पर वीडियो को नहीं काट सकता है, यह केवल keyframes पर काट सकता है; इस कारण से ऑडियो लगभग सटीक है, जबकि वीडियो नहीं है।

क्या मैं इसे स्वयं स्थानांतरित कर सकता हूं? मैं -force_key_frames 00 के साथ स्रोत फ़ाइल में मुख्य फ़्रेम जोड़ने की कोशिश करूँगा 00: 00: 00.2
पीट

जवाबों:


9

-ssयदि यह इनपुट या आउटपुट विकल्प के रूप में उपयोग किया जाता है, तो यह बदलाव का व्यवहार है , और अक्सर धीमा होता है, लेकिन आउटपुट विकल्प के रूप में उपयोग किए जाने पर अधिक सटीक हो सकता है। अधिक जानकारी और उदाहरण के लिए धीरे-धीरे निर्दिष्ट समय अवधि से वीडियो परिवर्तित करने के लिए ffmpeg का उत्तर देखें ।

18-28 (23 डिफ़ॉल्ट) के बीच मान के साथ विकल्प का source.mp4उपयोग करने के लिए आउटपुट गुणवत्ता बदलने के लिए -crf। उदाहरण के लिए FFmpeg और x264 एन्कोडिंग गाइड के CRF अनुभाग देखें ।

आपकी ट्रिमिंग कमांड को सरल बनाया जा सकता है:

ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4

मैंने -codec:v copy -codec:a copyसाथ दिया -c copy -map 0। यह सिर्फ पहले वीडियो और ऑडियो स्ट्रीम के बजाय सभी स्ट्रीम को कॉपी करेगा - हालांकि इनपुट में आपके पिछले कमांड के कारण केवल दो स्ट्रीम हैं। चूंकि आप पुन: एन्कोडिंग के बिना स्केल नहीं कर सकते हैं, इसलिए -codec:v copyआपके साथ पारस्परिक रूप से अनन्य है , और चूंकि आपका इनपुट पहले से सेट आकार में छोटा है , इसलिए मैंने फ़िल्टर विकल्प हटा दिए।

यदि यह अभी भी पर्याप्त सटीक नहीं है, तो प्रयास करें:

ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4

यह धीमा होगा, लेकिन शायद अधिक सटीक होगा। इन दोनों उदाहरणों के अंतर के विवरण के लिए मैंने जो पहली कड़ी प्रदान की है, उसके उत्तर में लिंक देखें।

अंत में, आपको (ffmpeg स्रोत में उपकरण निर्देशिका में स्थित) के source.mp4माध्यम से चलना चाहिए qt-faststartया -movflags faststartविकल्प का उपयोग करना चाहिए । यह फ़ाइल की शुरुआत में कुछ डेटा को स्थानांतरित कर देगा ताकि यह पूरी तरह से डाउनलोड होने से पहले प्लेबैक शुरू कर सके।


युक्तियों के लिए +1 लेकिन मैंने ffmpeg -i source.mp4 -ss 577.92 -t 011.980 -c कॉपी -मैप 0 क्लिप1.mp4 की कोशिश की, लेकिन पहला भाग (लगभग एक सेकंड) और अंतिम भाग (शायद एक सेकंड का चौथाई) वीडियो याद किया जाता है, हालांकि ऑडियो ठीक है।
पीट ओकेई

@PeteOakey क्या आपने बिटस्ट्रीम कॉपी के बिना काटने की कोशिश की है, लेकिन वास्तविक पुनः एन्कोडिंग?
slhck

बिटस्ट्रीम कॉपी के बिना इसे आज़माया गया - परिणाम मेरे प्रश्न से जुड़े।
पीट ओकेई

3
-ssइनपुट विकल्प के बजाय आउटपुट विकल्प के रूप में उपयोग करने से मेरी समस्या ठीक हो गई: पहला वीडियो फ्रेम आउटपुट वीडियो में लगभग 1s था, केवल ऑडियो से पहले (इसके द्वारा भी पुष्टि की गई थी ffprobe -show_frames)। आउटपुट ऑडियो और वीडियो फ्रेम बनाने के -ssबाद आगे बढ़ते -iहुए फ्रेम 0.
कोडमैनएक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.