কীভাবে অজানা সময়ের সাথে কোনও ভিডিও / অডিও ক্লিপ ফিড ইন / আউট করবেন?


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

এফএফম্পেগের একটি sseofবিকল্প রয়েছে যা একজনকে শেষ থেকে ইনপুট খোঁজার অনুমতি দেয়। আমরা আমাদের লক্ষ্য অর্জনের জন্য এটি ব্যবহার করতে পারি। সুতরাং আমরা দ্বিতীয়বার কেবলমাত্র শেষ দ্বিতীয়টি খাওয়ার সাথে দু'বার ইনপুটটি ফিড করি। টাইমস্ট্যাম্পগুলি সংরক্ষণ করার জন্য আমরা এফএফপেম্পিকে বলি, যাতে ffmpeg এই লেজের অংশের অস্থায়ী অবস্থান সংরক্ষণ করে।

আমরা এই লেজটিতে ফেইড আউট প্রয়োগ করি এবং তারপরে ফলাফলটি সম্পূর্ণ ইনপুটটিতে ওভারলে করি। যেহেতু তারা একই মিডিয়া ফাইল, অগ্রভাগ পুরোপুরি পটভূমিটি কভার করে এবং যেহেতু copytsপ্রয়োগ করা হয়েছিল, ওভারলেটি পটভূমির ইনপুটগুলিতে সংশ্লিষ্ট অভিন্ন ফ্রেমের উপরে ঘটে।

অডিওর জন্য, আমরা সময়কাল 2 সেকেন্ডের ফাঁকা ডামি অডিও তৈরি করি এবং তারপরে মূল অডিও থেকে এই ডামি অডিওতে একটি অডিও ক্রসফেইড প্রয়োগ করি। যেহেতু ২ য় অডিওটি ফাঁকা, এটি কার্যকরভাবে মূল ইনপুটটির জন্য একটি বিবর্ণ out -shortestডামি অডিও অংশ বাদ পরে ক্রসফেড ঘটেছে যোগ করা হয়।


এটি ত্রুটিটি দেয় "এ জাতীয় কোনও ফিল্টার নয়!" অডিও ফিল্টার জন্য।
অবিরত

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
এটি আসলে বেশ মার্জিত :-)
বিকে 138

এটি দুর্দান্ত কাজ করে। আপনি কিভাবে এটি কাজ করতে পারেন ব্যাখ্যা করতে পারেন। ডকুমেন্টেশনটি বোঝার চেষ্টা করছি ..
ওবেরহামসি

1
@ জোড়হামসি: বিকল্প 1: প্রথম ফিল্টারটি ট্র্যাকের শুরুতে একটি বিবর্ণ যুক্ত করে। এরপরে এটি অডিওকে বিপরীত করে এবং শুরুতে আরেকটি বিবর্ণ যোগ করে (যা আসলে শেষ)। অবশেষে ট্র্যাকটি আবার বিপরীত হয়। বিকল্প 2 0.6 সেকেন্ডের একটি নীরব ট্র্যাক তৈরি করে এবং মূল ট্র্যাকের সাথে একই সময়ের জন্য এটি ক্রসফ্যাড করে। সমস্ত ফিল্টার এবং তাদের ব্যবহার এখানে নথিভুক্ত করা হয়েছে: ffmpeg.org/ffmpeg-filters.html (যদিও আমি একমত যে এটি কিছুটা রহস্যজনক)
মারেকভেন্টার

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 এর উত্তর হ'ল এক উত্তেজনাপূর্ণ হ্যাঁ! -> এটি এখনও নেই। প্রশ্নটি ffmpeg স্বয়ংক্রিয়ভাবে সময়কাল নির্ধারণ করতে পারে ... তবে আপনি একটি স্ক্রিপ্ট লিখেছেন যা এটি করার জন্য একাধিক ff * কমান্ড চালায়। যদিও * নিক্স সিস্টেমের জন্য দরকারী।
জ্ঞান

আমি দেখতে পাচ্ছি, তাই আপনি জোর দিয়েছিলেন যে আপনার উত্তর এখনও ঠিক আছে? আপনি যদি আমার স্ক্রিপ্টটি অনুসরণ করেন তবে আপনি দেখতে পাবেন যে এটি প্রকৃতপক্ষে automatically figure out the durationব্যবহার করছে ffprobe, যা ইনস্টল করা আছে ffmpeg। কমান্ডের সংখ্যার উপর কোনও বিধিনিষেধ সম্পর্কে কে কিছু বলেছিল বা *nix? দেখে মনে হয় যে ওপি ইউনিক্সের একটি সংস্করণ ব্যবহার করছে। কোন .exeসালে ffmpegকমান্ড। আমি নিজেই ব্যবহার করছি OS Xযা নির্মিত হয়েছে UNIXতবে তা নয় UNIX
hmj6jmh

1
* আপনি যদি আমার স্ক্রিপ্টটি অনুসরণ করেন, আপনি দেখতে পাবেন যে এটি প্রকৃতপক্ষে স্বয়ংক্রিয়ভাবে বের হয়ে যায় * -> আপনার স্ক্রিপ্টটি করে, ffmpeg এটি করে না।
জ্ঞান

তবে বিতরণের ffprobeএকটি অবিচ্ছেদ্য অঙ্গ ffmpeg। আপনি মুখের আইএমও বাঁচাতে নিটে বাছাই করছেন।
hmj6jmh

আমার একমত হতে হবে যে ব্যাশ স্ক্রিপ্ট দ্বারা কিছু করা হচ্ছে ffmpeg দ্বারা স্বয়ংক্রিয়ভাবে কিছু করা হচ্ছে না । তবে এটি যদি কাজ করে তবে সমস্যাটি ঘিরে কাজ করার এটি একটি উপায়। সুতরাং "ওয়ার্কারআউন্ড" শব্দটি। এটি কাজ করে কিনা তা আমি বলতে পারি না কারণ আমি, বেশিরভাগ লোকের মতো, ব্যাশ বা ইউনিক্স সিস্টেম নেই। যেভাবেই চেষ্টা করার জন্য +1 করুন 1
ashleedawg
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.