थोक में कई MP4 फ़ाइलों से शुरुआत और अंत निकालें


3

मेरे पास कई 100 वीडियो हैं जिन्हें मुझे पहले 20 सेकंड और अंतिम 30 सेकंड निकालने की आवश्यकता है।

एक बार में ऐसा करने के लिए स्पष्ट रूप से व्यावहारिक नहीं है। क्या मैं इसे किसी भी तरह से स्वचालित कर सकता हूं, शायद ओएस एक्स ऑटोमेटर स्क्रिप्ट में?

जवाबों:


4

आप मानते हैं कि * निक्स और बैश चलाते हैं, एक ffmpeg स्थिर बिल्ड डाउनलोड करें आपके ऑपरेटिंग सिस्टम के लिए। फिर, ले लो ffmpeg फ़ाइल और इसे कॉपी करें /usr/bin/ffmpeg

sudo cp ~/Downloads/ffmpeg/ffmpeg /usr/bin/ffmpeg
sudo chmod +x /usr/bin/ffmpeg

अब आप इस शेल स्क्रिप्ट को बैश में चला सकते हैं - इसे उस फ़ोल्डर में कॉपी-पेस्ट करने के लिए पर्याप्त होना चाहिए जहां वीडियो हैं।

for f in *.mp4; do
    duration=$(ffmpeg -i "$f" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//)
    length=$(echo "$duration" | awk '{ split($1, A, ":"); print 3600*A[1] + 60*A[2] + A[3] }' )
    trim_start=20
    trim_end=$(echo "$length" - 30 - "$trim_start" | bc)
    echo ffmpeg -ss "$trim_start" -i "$f" -c copy -map 0 -t "$trim_end" "${f%.mp4}-trimmed.mp4"
done

ध्यान दें: हटाए echo बयान वास्तव में आदेशों को पूरा करने के लिए। सटीकता के लिए पहले उत्पन्न कमांड का परीक्षण करना अच्छा होगा। यह कुछ ऐसा उत्पन्न करेगा:

ffmpeg -ss 20 -i input.mp4 -c copy -map 0 -t 161.58 input-trimmed.mp4

स्क्रिप्ट क्या करेगी, इनपुट के कुल चलने के समय की गणना करें, प्रारंभ समय और उस समय को घटाएं जिसे आप अंत से हटाना चाहते हैं, और फिर ffmpeg को अपने निर्दिष्ट प्रारंभ समय से नई गणना के अंत तक एक स्ट्रीम-कॉपी करने के लिए कहें। पहर। यह वीडियो और ऑडियो गुणवत्ता को किसी भी तरह से नुकसान नहीं पहुंचाएगा। यह बड़ी फ़ाइलों के लिए कम से कम कुछ सेकंड के भीतर चलना चाहिए।

स्पष्टीकरण देना, -ss प्रारंभ समय और सेट करता है -c copy -map 0 सभी वीडियो, ऑडियो और उपशीर्षक धाराओं को मूल से कट संस्करण में कॉपी करेगा। -t अंत समय निर्धारित करता है। देख एफएफएमपी विकी पर यह लेख मांगने के बारे में अधिक जानकारी के लिए।


0

यदि आप कमांड लाइन के साथ सहज हैं, तो मैं सुझाऊंगा FFmpeg

ffmpeg -i file.mp4 -vcodec copy -acodec copy -ss 00:00:20.000 -t 00:00:30.000 output.mp4

एक अन्य विकल्प एक छोटा शेल स्क्रिप्ट है जो आपकी फ़ाइलों के माध्यम से लूप करता है और उनमें से प्रत्येक के लिए एक सिंगल-फाइल FFmpeg जॉब चलाता है। फिर मैंने कभी मैक शेल का इस्तेमाल नहीं किया :)

for f in *.mp4; do ffmpeg -i $f -vcodec copy -acodec copy -ss 00:00:20.000 -t 00:00:30.000 output/$f; done

उम्मीद है कि यह थोड़ा मदद करता है।


ओपी को अंतिम 30 सेकंड निकालने की जरूरत है, 30 सेकंड के लिए एनकोड न करें, इसलिए आपका दृष्टिकोण काम नहीं करता है। इसके अलावा, इनपुट सिंटैक्स के साथ %d केवल छवियों के लिए समर्थित है (अधिक विशेष रूप से image2 डिमॉक्सर )।
slhck
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.