ffmpeg - 'অতীতের সময়কাল X.XXX খুব বড়' এর অর্থ কী?




(4)

আমি একটি বিশেষ এনকোড দিয়ে এই হাজার হাজার সতর্কতা পাচ্ছিলাম। আমি 1080p ভিডিওটি 480p এ নামিয়ে আছি। একটি সম্পাদনার সময়ে, যেখানে উত্স লেজারডিস্কের ত্রুটির কারণে কিছু ছদ্মবেশী ভিডিও ছিল, এই বার্তাগুলি আসতে শুরু করেছিল এবং তারপরে তারপরে প্রতিটি ফ্রেমের জন্য উপস্থিত হয়েছিল বলে আমি মনে করি। তারা এই সংক্ষিপ্ত অংশটির মতোই চলতে থাকে:

Past duration 0.901115 too large=  535031kB time=00:54:15.06 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 31 times
Past duration 0.901115 too large=  535031kB time=00:54:15.62 bitrate=1346.3kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 34 times
Past duration 0.901115 too large=  535031kB time=00:54:16.21 bitrate=1346.0kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 36 times
Past duration 0.901115 too large=  535338kB time=00:54:16.83 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 39 times

মূল ffmpeg অনুরোধটি ছিল:

ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv

এখানে পরামর্শ অনুসরণ করে আমি প্রথমে ইনপুট-ফ্রেমরেট 60000/1001 যুক্ত করেছি। তাতে কোনও উন্নতি হয়নি। আমি-ফ্রেমরেট ধরে রেখেছি এবং আউটপুট -r 60000/1001 যুক্ত করেছি। এখনও কিছু উন্নতি হয়নি। উভয়কেই ধরে রেখে শেষ পর্যন্ত আমি 1 -vncnc 1 যুক্ত করেছিলাম This এটি আমার একক সতর্কতা পেয়েছিল এবং এটিই যথেষ্ট। এই প্রার্থনাটি ছিল:

ffmpeg -i input.mp4 -framerate 60000/1001 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -r 60000/1001 -async 1 -vsync 1

মিডিয়াআইএনফো থেকে বিস্তারিত ডাম্পে আমি যে পার্থক্যটি পেয়েছি তা হ'ল মূল অনুরোধে পাওয়া এই লাইনটি অপসারণ করা তবে দ্বিতীয়টিতে নয়:

Delay relative to video                  : -33ms

যাইহোক, আমি ফাইলগুলির শুরুতে এবং শেষের নিকটে A / V সিঙ্কটি পরীক্ষা করে দেখেছি এবং দুটি ফাইলের মধ্যে সিঙ্কে কোনও পৃথক পৃথক নেই difference তাদের চলমান সময়গুলিও একই ছিল, তবে এটি কেবলমাত্র ভিএলসির নিকটবর্তী দ্বিতীয়টিতে পরিমাপ করা হয়েছিল। সুতরাং আমি ffmpeg এর মত ফ্রেম গণনাগুলি পরীক্ষা করেছিলাম:

ffmpeg -i output.mkv -map 0:v:0 -c copy -f null -

এবং আউটপুট শেষে "ফ্রেম = #" খুঁজছেন।

উত্সটির ভিডিওটি দেখা গেছে 375226 ফ্রেম লম্বা, আসল প্রার্থনাটি 375195 ফ্রেম পেয়েছে এবং দ্বিতীয় আহ্বানটি 375200 পেয়েছিল inv সুতরাং দ্বিতীয় আহবান, খুব কম সতর্কতা বার্তা সহ 5 টি কম ফ্রেমও নামিয়েছে।

পরবর্তী পরীক্ষায় দেখা গেছে যে-ফ্রেমারেট এবং -r অপ্রয়োজনীয় ছিল এবং কেবল দুটি সিঙ্ক পতাকা ব্যবহার করা যথেষ্ট ছিল। এটি উপরের দ্বিতীয় অনুরোধের মতো অভিন্ন ফলাফল এনেছে, সুতরাং আমি সমস্যাটি সমাধান করতে পেল তৃতীয় এবং সহজ অনুরোধটি হ'ল:

ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -async 1 -vsync 1

এবং অন্য একটি ফাইল পরবর্তীকালে সিঙ্ক ফ্ল্যাগগুলির সাথেও এই সতর্কতাগুলির একগুচ্ছ উত্পাদন করেছিল, তবে রেট ফ্ল্যাগগুলি এটি "স্থির" করে যোগ করে (কেবলমাত্র কয়েক হাজার সতর্কতার পরিবর্তে দুটি উত্পাদিত)। তাই কখনও কখনও দ্বিতীয় অনুরোধ কাজ করে যখন তৃতীয়টি না করে। আমার তাত্ক্ষণিক উদ্দেশ্যে আমি দ্বিতীয় অনুরোধটি স্থির করতে যাচ্ছি এবং আশা করি এটি এই সমস্যার বেশিরভাগ সমাধান করে।

এটি ffmpeg সংস্করণ 4.0 ছিল।

Ffmpeg ব্যবহার করে এইচ .২64 enc এনকোডিং করার সময় আমি নিম্নলিখিত ধরণের সতর্কতাগুলি পেয়েছি se

Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large

তাঁরা কি বোঝাতে চাইছেন? আমি অনলাইনে বা ffmpeg ডকুমেন্টেশনে পরিষ্কার কিছু খুঁজে পাইনি।


কম ফ্রেম রেট আউটপুটে উচ্চ ফ্রেম রেট উত্সকে এনকোড করার চেষ্টা করার সময় এই সতর্কতা বার্তাটি উপস্থিত হয় যার অর্থ ফ্রেমগুলি বাদ দেওয়া দরকার।

আমার এই ত্রুটি ছিল কারণ আমি একটি সিরিজের চিত্রগুলিকে একটি ভিডিওতে রূপান্তর করতে চেয়েছিলাম:

ffmpeg -i %05d.png -r 24 -c:v libx264 -crf 5 out.mkv

সমস্যাটি মনে হচ্ছে, যদি ইনপুটটির জন্য কোনও ফ্রেম রেট না দেওয়া হয়, তবে 25 fps এর ফ্রেম রেট ধরে নেওয়া হয়:

Input #0, image2, from 'frames/%04d.bmp':
  Duration: 00:00:15.96, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: bmp, bgra, 920x650, 25 fps, 25 tbr, 25 tbn, 25 tbc

এটি এনকোড করা ফ্রেমের মোট সংখ্যাতেও দেখা যায়। আমার 400 টি চিত্র ছিল তবে উপরের কমান্ডটি কেবল 384 টি এনকোড করেছে:

frame=  384 fps= 68 q=-1.0 Lsize=   10931kB time=00:00:15.91 bitrate=5626.1kbits/s dup=0 drop=15    
video:10928kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.033807%

আউটপুট ফ্রেম হারের পরিবর্তে ইনপুট ফ্রেম হার সেট করে ত্রুটি বার্তাগুলি অদৃশ্য হয়ে যায়। তারপরে আউটপুট ফ্রেম রেটটি স্বয়ংক্রিয়ভাবে ইনপুট হওয়ার জন্য বেছে নেওয়া হবে। অতিরিক্ত Ffmpeg সংস্করণগুলিতে আপনাকে নজর রাখতে হবে, কারণ -i বিকল্পের পরিবর্তে চিত্র image2 বা v4l2 ইনপুট ফর্ম্যাট সহ পিএনজি চিত্র ব্যবহার করার সময় আপনাকে -r পরিবর্তে- -framerate ব্যবহার করতে হবে, -r বিকল্পের জন্য ডকুমেন্টেশন দেখুন।

ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv

উভয়ই ইনপুট এবং আউটপুটের ফ্রেম রেট পৃথকভাবে নির্দিষ্ট করা সম্ভব:

ffmpeg -framerate 25 -i %05d.png -r 10 -c:v libx264 -crf 5 out.mkv

এই ক্ষেত্রে কেবল 161/400 ফ্রেম এনকোড করা হবে। অন্যান্য ফ্রেম অন্তর্বর্তী বাদ দেওয়া হবে। ত্রুটি বার্তাটিও অদৃশ্য হয়ে যায়, আমি অনুমান করি যে স্টাফাউটে স্প্যামিং করে ffmpeg ধীর না করার জন্য দেখুন:


উত্স কোডটি দেখে মনে হচ্ছে যে ইনপুট স্ট্রিমে উপস্থাপনা সময় (পিটিএস) এর মধ্যে পার্থক্য আউটপুট স্ট্রিমের মধ্যে একটি নির্দিষ্ট সীমা থেকে 0.6-এ সেট করে আলাদা হয়।

উত্স থেকে স্নিপেটস:

    delta0 = sync_ipts - ost->sync_opts;
    delta  = delta0 + duration;

...

        if (delta0 < 0 &&
        delta > 0 &&
        format_video_sync != VSYNC_PASSTHROUGH &&
        format_video_sync != VSYNC_DROP) {
        double cor = FFMIN(-delta0, duration);
        if (delta0 < -0.6) {
            av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
        } else
            av_log(NULL, AV_LOG_DEBUG, "Cliping frame in rate conversion by %f\n", -delta0);
        sync_ipts += cor;
        duration -= cor;
        delta0 += cor;
    }

এটি কেবলমাত্র এক দ্রুত দৃষ্টি, তাই দয়া করে আরও গভীর খনন করুন।