audio - বিভিন্ন সময়কালের ইনপুট সহ এফএফএমপিইগ অ্যামিক্স ফিল্টার ভলিউম সমস্যা




ffmpeg mix (6)

আমি যে সমাধানটি পেয়েছি তা হ'ল "বংশধর" ক্রমে প্রতিটি ট্র্যাকের জন্য ভলিউম নির্দিষ্ট করা এবং পরে কোনও স্বাভাবিককরণের ফিল্টার ব্যবহার করা উচিত নয়

আমি এই উদাহরণটি ব্যবহার করি, যেখানে আমি একই অডিও ফাইলটি বিভিন্ন অবস্থানে সমাহার করি:

ffmpeg -vn -i test.mp3 -i test.mp3 -i test.mp3 -filter_complex "[0]adelay=0|0,volume=3[a];[1]adelay=2000|2000,volume=2[b];[2]adelay=4000|4000,volume=1[c];[a][b][c]amix=inputs=3:dropout_transition=0" -q:a 1 -acodec libmp3lame -y amix-volume.mp3

আরও বিশদ, এই চিত্রটি দেখুন। প্রথম ট্র্যাকটি সাধারণ মিক্সিং, দ্বিতীয়টি নির্দিষ্ট ভলিউম সহ একটি; তৃতীয়টি আসল ট্র্যাক। যেহেতু আমরা দেখতে পাচ্ছি ২ য় ট্র্যাকের একটি সাধারণ ভলিউম রয়েছে।

ffmpeg -vn -i test.mp3 -i test.mp3 -i test.mp3 -filter_complex "[0]adelay=0|0[a];[1]adelay=2000|2000[b];[2]adelay=4000|4000[c];[a][b][c]amix=inputs=3:dropout_transition=0" -q:a 1 -acodec libmp3lame -y amix-no-volume.mp3

ffmpeg -vn -i test.mp3 -i test.mp3 -i test.mp3 -filter_complex "[0]adelay=0|0,volume=3[a];[1]adelay=2000|2000,volume=2[b];[2]adelay=4000|4000,volume=1[c];[a][b][c]amix=inputs=3:dropout_transition=0" -q:a 1 -acodec libmp3lame -y amix-volume.mp3

আমি বুঝতে পারি না কেন অ্যামিক্স ভলিউম পরিবর্তন করে; যাহাই হউক না কেন; আমি একটি ভাল সমাধান জন্য কিছুক্ষণ কাছাকাছি খনন ছিল।

আমি লক্ষ্য করেছি যে ffmpeg amix ফিল্টার নির্দিষ্ট পরিস্থিতিতে ভাল ফলাফল দেয় না। ইনপুট ফাইলগুলির সমান সময়কাল থাকলে এটি ঠিকঠাক কাজ করে। সেক্ষেত্রে ভলিউম ধ্রুবক মানতে ফেলে দেওয়া হয় এবং ",volume=2" দিয়ে স্থির করা যেতে পারে।

আমার ক্ষেত্রে আমি বিভিন্ন সময়কাল সহ ফাইলগুলি ব্যবহার করছি। রেজোল্টেড ভলিউম ভাল নয়। প্রথম মিশ্র স্ট্রিমটির ফলস্বরূপ সর্বনিম্ন ভলিউম, এবং সর্বশেষটি সর্বোচ্চ। আপনি ইমেজে দেখতে পাচ্ছেন যে সময়ের সাথে আয়তনের ধারাবাহিকভাবে বৃদ্ধি পেয়েছে।

আমার আদেশ:

ffmpeg -i temp_0.mp4 -i user_2123_10.mp4  -i user_2123_3.mp4  -i user_2123_4.mp4  
-i user_2123_7.mp4  -i user_2123_5.mp4  -i user_2123_1.mp4  -i user_2123_8.mp4  
-i user_2123_0.mp4  -i user_2123_6.mp4  -i user_2123_9.mp4  -i user_2123_2.mp4  
-i user_2123_11.mp4 -filter_complex "[1:a]adelay=34741.0[aud1];
[2:a]adelay=18241.0[aud2];[3:a]adelay=20602.0[aud3];
[4:a]adelay=27852.0[aud4];[5:a]adelay=22941.0[aud5];
[6:a]adelay=13142.0[aud6];[7:a]adelay=29810.0[aud7];
[8:a]adelay=12.0[aud8];[9:a]adelay=25692.0[aud9];
[10:a]adelay=32143.002[aud10];[11:a]adelay=16101.0[aud11];
[12:a]adelay=40848.0[aud12];
[0:a][aud1][aud2][aud3][aud4][aud5][aud6][aud7]
[aud8][aud9][aud10][aud11]
[aud12]amix=inputs=13:duration=first:dropout_transition=0" 
-vcodec copy -y temp_1.mp4

এটি প্রতিটি ক্লিপের শুরু এবং শেষে নীরবতা প্রয়োগের মাধ্যমে স্থির করা যেতে পারে, তারপরে তাদের একই সময়কাল হবে এবং ভলিউম একই স্তরে থাকবে।

আমি কীভাবে অনেক ইনপুট মিশ্রিত করতে এবং ধ্রুবক ভলিউমের স্তর নিশ্চিত করতে amix ব্যবহার করতে পারি তা দয়া করে প্রস্তাব দিন।


আমি আপনাকে আমার কোডটি প্রদর্শন করব।

"amix="+inputs.size()+",volume="+(inputs.size()+1)/2+"[mixout]\""

আমি dropout_transition=0 কোডটি ব্যবহার করি না কারণ এটি আপনার সমস্যার সাথে দেখা করবে।

তবে ইনপুটসের আকার বাড়ার সাথে সাথে ভলিউমটি কম হবে বলেও আমি সমস্যাটি দেখতে পাই।

তাই আমি ভলিউমটি আরও জোরে করব।


গুণন ব্যবহার করার চেষ্টা করুন:

"amix=inputs="+ chunks.length + ":duration=first:dropout_transition=3,volume=" + chunks.length

দুঃখিত, ffmpeg আউটপুট না প্রেরণের জন্য।

সর্বোপরি আমরা অডিও মিশ্রণের জন্য সি ++ এ ছোট ব্যবহার লিখে শেষ করেছি। তবে প্রথমে আমরা এমপি 4 কে কাঁচা (পিসিএম) ফর্ম্যাটে রূপান্তর করি। এটি আমাদের পক্ষে ঠিক কাজ করেছে, এমনকি কাঁচা মধ্যবর্তী ফাইলের জন্য অতিরিক্ত এইচডিডি স্থান প্রয়োজন।

কোডটি এর মতো দেখাচ্ছে:

short addSounds(short a, short b) {
    double da = a;
    da /= 65536.0;
    da += 0.5;
    double db = b;
    db /= 65536.0;
    db += 0.5;
    double z = 0;
    if (da < 0.5 && db < 0.5) {
        z = 2 * da*db;
    }
    else {
        z = 2 * ( da + db ) - 2 * da* db - 1;
    }
    z -= 0.5;
    z *= 65536.0;
    return (short)z;
}

সমাধানটি "প্রি-অ্যাম্প" বা গুণের সংমিশ্রণ বলে মনে হচ্ছে যেমন ম্যাক্সিম এটি dropout_transition >= max delay + max input length এবং আপনাকে dropout_transition >= max delay + max input length (বা খুব উচ্চ সংখ্যা) নির্ধারণ করতে হবে:

amix=inputs=13:dropout_transition=1000,volume=13

নোট:

  • amix যাইহোক amix পুনরায় নমুনা করতে হবে, সুতরাং volume ফিল্টার যুক্ত করার কোনও খারাপ দিক নেই (যা ডিফল্টরূপে amix করে)।
    এবং যেহেতু আমরা ভাসমান ব্যবহার করছি, তাই কোনও ক্লিপিং নেই এবং (প্রায়) নির্ভুলতার কোনও ক্ষতি নেই।
  • বিশ্লেষণের জন্য @ মালব্যকে নয় তবে তাদের সমাধান হতাশাজনকভাবে অ-গাণিতিক
  • আমি প্রথমে sox দিয়ে এটি করার চেষ্টা করছিলাম, যা খুব ধীর ছিল। Sox এর remix ফিল্টারটিতে -m সুইচ রয়েছে যা 1/n সামঞ্জস্যটি অক্ষম করে।
  • দ্রুত হওয়ার সাথে সাথে, ffmpeg একই কাজের জন্য আরও বেশি মেমরি ব্যবহার করছে বলে মনে হচ্ছে। ওয়াইএমএমভি - আমি এটি পুরোপুরি পরীক্ষা করে দেখিনি, কারণ শেষ পর্যন্ত আমি একটি ছোট অজগর স্ক্রিপ্টে pydub যা pydub overlay ফাংশনটি ব্যবহার করে এবং কেবল চূড়ান্ত আউটপুট ফাইল এবং একটি অংশকে মেমরিতে রাখে (যেখানে ffmpeg এবং sox সমস্ত কিছু রাখে বলে মনে হয়) স্মৃতিতে বিভাগগুলি)।

amix প্রতিটি amix ভলিউম 1/n দ্বারা স্কেল করে যেখানে এন = না। সক্রিয় ইনপুট। এটি প্রতিটি অডিও ফ্রেমের জন্য মূল্যায়ন করা হয়। সুতরাং যখন কোনও ইনপুট বাইরে যায়, তখন বাকী ইনপুটগুলির ভলিউম একটি অল্প পরিমাণ দ্বারা স্কেল করা হয়, যার ফলে তাদের আয়তন বৃদ্ধি পায়।

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

বর্তমানে আপনার কাছে দুটি বিকল্প রয়েছে, loudnorm বা dynaudnorm ফিল্টার। পরেরটি অনেক দ্রুত

সিনট্যাক্সটি এটি অ্যামিক্সের পরে যুক্ত করা হয়, তাই

[aud11][aud12]amix=inputs=13:duration=first:dropout_transition=0,dynaudnorm"

ডকুমেন্টেশনটি পড়ুন, আপনি সর্বাধিক ভলিউম বা আরএমএস মোডের স্বাভাবিককরণের জন্য প্যারামিটারগুলি মুছতে চান .. ইত্যাদি