कैसे अज्ञात अवधि के साथ एक वीडियो / ऑडियो क्लिप में फीका करने के लिए?


19

मैं एक परियोजना पर काम कर रहा हूँ जहाँ मैं ffmpeg का उपयोग बैच में कुछ वीडियो फ़ाइलों को परिवर्तित करने के लिए कर रहा हूँ, और प्रत्येक क्लिप के सिर और पूंछ पर फीका / आउट प्रभाव जोड़ रहा हूँ।

मैं ज्ञात ड्यूरेशन के साथ क्लिप पर फीका / आउट प्रभाव जोड़ने के लिए इस बिट कोड का उपयोग कर रहा हूं:

ffmpeg -i clip.mp4 -filter:v 'fade=in:0:30,fade=out:9650:30' -c:v libx264 -crf 22 -preset veryfast -c:a copy fadeInOut.mp4

मेरे दो प्रश्न हैं:

  1. मैं एक साथ / बाहर ऑडियो कैसे ठीक कर सकता हूँ?
  2. क्या ffmpeg स्वतः क्लिप की अवधि का पता लगा सकता है और अंतिम 30 फ्रेम को फीका बता सकता है?

धन्यवाद!

जवाबों:


15

# 1 एक साथ / बाहर ऑडियो फीका करने के लिए:

ffmpeg -i clip.mp4 -vf 'fade=in:0:30,fade=out:960:30'
                   -af 'afade=in:st=0:d=1,afade=out:st=32:d=1'
       -c:v libx264 -crf 22 -preset veryfast fadeInOut.mp4

उतने समय सेकंड में हैं

# 2 स्वचालित रूप से? नहीं, लेकिन नीचे वर्कअराउंड देखें

आप पहली बार अवधि प्राप्त करने के लिए ffprobe चला सकते हैं।

ffprobe -i clip.mp4 -show_entries stream=codec_type,duration -of compact=p=0:nk=1

आपको कुछ इस तरह मिलेगा:

video|13.556000
audio|13.816000

फिर आप अपने फ़ेड को लगाने के लिए उपरोक्त का उपयोग कर सकते हैं। ये समय सेकंडों में है।

वैकल्पिक हल

ffmpeg -i clip.mp4 -sseof -1 -copyts -i clip.mp4 -filter_complex
       "[1]fade=out:0:30[t];[0][t]overlay,fade=in:0:30[v];
        anullsrc,atrim=0:2[at];[0][at]acrossfade=d=1,afade=d=1[a]"
       -map "[v]" -map "[a]" -c:v libx264 -crf 22 -preset veryfast -shortest fadeInOut.mp4

FFmpeg में एक sseofविकल्प है जो किसी को अंत से इनपुट प्राप्त करने की अनुमति देता है। हम अपने लक्ष्य को पूरा करने के लिए इसका उपयोग कर सकते हैं। तो हम इनपुट को दो बार खिलाते हैं, 2 बार के साथ केवल अंतिम सेकंड में प्रवेश करते हैं। हम FFmpeg को टाइमस्टैम्प को संरक्षित करने के लिए कहते हैं, ताकि ffmpeg इस टेल हिस्से की अस्थायी स्थिति को बनाए रखे।

हम इस पूंछ के लिए एक फीका लागू करते हैं और फिर पूर्ण इनपुट पर परिणाम ओवरले करते हैं। चूंकि वे एक ही मीडिया फ़ाइल हैं, अग्रभूमि पूरी तरह से पृष्ठभूमि को कवर करती है, और जब copytsसे लागू किया गया था, ओवरले पृष्ठभूमि इनपुट में इसी समान फ्रेम पर होता है।

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


यह त्रुटि देता है "ऐसा कोई फ़िल्टर नहीं!" ऑडियो फिल्टर के लिए।
felwithe

1
इसमें 4 ऑडियो फिल्टर का इस्तेमाल किया गया है। कौनसा? -reportजोड़ा गया और रिपोर्ट साझा करने के साथ अपनी कमांड चलाएं ।
ज्ञान

7

यह एक भयानक हैक है, लेकिन यह काम कर सकता है यदि आप सब करना चाहते हैं तो ऑडियो फीका है / बाहर, लेकिन वास्तव में क्लिप कितनी देर तक नहीं जानता:

ffmpeg -i input.mp4 -filter_complex "afade=d=0.5, areverse, afade=d=0.5, areverse" output.mp4

[संपादित करें 2019-07-24: ध्यान दें कि यह समाधान स्ट्रीमिंग के समाधान के लिए अच्छा नहीं है क्योंकि इसके लिए पहले बाइट को स्ट्रीम करने से पहले पूर्ण ट्रैक को संसाधित करने की आवश्यकता होती है]

एक अन्य विकल्प मैं acrossfadeएक मूक ट्रैक के साथ उपयोग करना है:

ffmpeg -i input.mp4 -filter_complex "aevalsrc=0:d=0.6 [a_silence]; [0:a:0] [a_silence] acrossfade=d=0.6" output.mp4

3
यह वास्तव में बहुत सुंदर है :-)
bk138

यह बहुत अच्छा काम करता है। क्या आप बता सकते हैं कि यह कैसे काम करता है। प्रलेखन की समझ बनाने की कोशिश कर रहा है ..
oberhamsi

1
@ रॉबर्टहैमी: विकल्प 1: पहला फिल्टर ट्रैक की शुरुआत में एक फीका जोड़ता है। यह तब ऑडियो को उल्टा करता है और शुरुआत में एक और फीका जोड़ता है (जो वास्तव में अंत है)। अंत में ट्रैक फिर से उलट है। विकल्प 2 0.6 सेकंड का एक मूक ट्रैक बनाता है और मूल ट्रैक के साथ समान समय के लिए इसे क्रॉसफ़ेड करता है। सभी फ़िल्टर और उनके उपयोग यहाँ प्रलेखित हैं: ffmpeg.org/ffmpeg-filters.html (हालांकि मुझे इस बात से सहमत होना होगा कि यह थोड़ा गूढ़ है)
marekventur

3

प्रश्न 2 का उत्तर एक शानदार हां है! मैं उसी कार्यक्षमता की तलाश में था और मैंने एक बैश स्क्रिप्ट लिखी जो सेकंड में फीका अवधि पूछती है और फीका-आउट के लिए प्रारंभिक फ्रेम की गणना करता है:

#!/bin/bash

f="$*" # all args
p="${f##*/}" # file
fn="${p%.*}" # name only
e="${p##*.}" # extension

echo
echo $f
echo $p
echo $fn
echo $e
echo

read -e -p "Number of seconds of fade-out: " -i 1 sec # prompt for fade duration in seconds

r=$(ffprobe -show_streams "$f" 2> /dev/null | grep r_frame_rate | head -1 | cut -d \= -f 2) # frame rate
let "frames = $r * $sec" # duration of fade as number of frames
echo $r
echo $sec
echo $frames
lf=$(ffprobe -show_streams "$f" 2> /dev/null | grep nb_frames | head -1 | cut -d \= -f 2) # total number of frames
let "lf = $lf - $frames" # initial frame to start fade at

ffmpeg -loglevel quiet -i "$f" -vf fade=out:$lf:$frames -r $r -vcodec libx264 -preset slow -crf 12 -bf 2 -flags +cgop -pix_fmt yuv420p -acodec copy "$fn $sec sec fade-out.$e"
open "$fn $sec sec fade-out.$e"

फ़ेड्स को एक उच्च गुणवत्ता फिर से एनकोड करने के crfलिए कम मूल्य का उपयोग करके पुनः एन्कोडिंग की आवश्यकता होती है libx264। टिप्पणियों को बाकी सब कुछ समझाना चाहिए।


प्रश्न 2 का उत्तर एक शानदार हां है! -> यह अभी भी नंबर है क्यू कैन कैन एफएफएमपीपी स्वचालित रूप से अवधि का पता लगा सकता है ... लेकिन आपने एक स्क्रिप्ट लिखी है जो इसे करने के लिए कई एफएफ * कमांड चलाता है। * निक्स सिस्टम के लिए उपयोगी है, हालांकि।
ज्ञान

मैं देखता हूं, इसलिए आप जोर देकर कहते हैं कि आपका उत्तर सही है? यदि आप मेरी स्क्रिप्ट का पालन करते हैं, तो आप देखेंगे कि यह वास्तव में automatically figure out the durationउपयोग कर रहा है ffprobe, जो कि स्थापित है ffmpeg। आदेशों की संख्या पर किसी भी प्रतिबंध के बारे में किसने कुछ कहा या *nix? ऐसा लगता है कि ओपी UNIX के एक संस्करण का उपयोग कर रहा है। आज्ञा .exeमें नहीं ffmpeg। मैं खुद उपयोग कर रहा हूं OS Xजो बनाया गया है, UNIXलेकिन नहीं है UNIX
hmj6jmh

1
* यदि आप मेरी स्क्रिप्ट का अनुसरण करते हैं, तो आप देखेंगे कि यह वास्तव में स्वचालित रूप से पता लगाता है * -> आपकी स्क्रिप्ट करता है, ffmpeg नहीं करता है।
ज्ञान

लेकिन वितरण ffprobeका एक अभिन्न हिस्सा है ffmpeg। आप चेहरा IMO को बचाने के लिए nits पर चुन रहे हैं।
hmj6jmh

मुझे इस बात से सहमत होना चाहिए कि एक bash स्क्रिप्ट के द्वारा किया जा रहा कुछ ffmpeg द्वारा स्वचालित रूप से किया जा रहा कुछ नहीं है। लेकिन अगर यह काम करता है, तो यह उस समस्या के आसपास काम करने का एक तरीका है। इसलिए "वर्कअराउंड" शब्द। मैं यह नहीं कह सकता कि यह काम करता है क्योंकि मैं, ज्यादातर लोग वहाँ से बाहर निकलना चाहते हैं, जिसमें बैश या यूनिक्स सिस्टम नहीं है। किसी भी तरह से प्रयास के लिए +1।
ashleedawg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.