DASH এর জন্য FFmpeg- এ কীফ্রেমগুলি ঠিক করার সঠিক উপায় কী?


38

ড্যাশ প্লেব্যাকের জন্য কোনও স্ট্রিমের কন্ডিশনিং করার সময়, এলোমেলো অ্যাক্সেস পয়েন্টগুলি অবশ্যই সমস্ত স্ট্রিমের একই উত্স স্ট্রিম সময়ে হওয়া উচিত। এটি করার স্বাভাবিক উপায় হ'ল একটি স্থির ফ্রেম রেট এবং স্থির জিওপি দৈর্ঘ্য (অর্থাত্ প্রতিটি এন ফ্রেমের একটি কীফ্রেম) জোর করা।

FFmpeg এ, স্থির ফ্রেমের হার সহজ (-r NUMBER)।

তবে স্থির কীফ্রেমের অবস্থানগুলির জন্য (জিওপি দৈর্ঘ্য), তিনটি পদ্ধতি রয়েছে ... কোনটি "সঠিক"? এফএফপিপেগ ডকুমেন্টেশন হতাশার সাথে এটি সম্পর্কে অস্পষ্ট।

পদ্ধতি 1: libx264 এর যুক্তিগুলির সাথে বিশৃঙ্খলা

-c:v libx264 -x264opts keyint=GOPSIZE:min-keyint=GOPSIZE:scenecut=-1

পরিস্থিতিটি বন্ধ করা উচিত কিনা তা নিয়ে কিছুটা বিতর্ক আছে বলে মনে হচ্ছে, কারণ দৃশ্যের কাটা ঘটলে কীফ্রেম "কাউন্টার" পুনরায় চালু করা হয়েছে কিনা তা অস্পষ্ট।

পদ্ধতি 2: একটি স্থির জিওপি আকার নির্ধারণ:

-g GOP_LEN_IN_FRAMES

দুর্ভাগ্যক্রমে এটি কেবল এফএফএমপিইজি ডকুমেন্টেশনে পাস করার ক্ষেত্রে ডকুমেন্টেড, এবং এইভাবে এই যুক্তির প্রভাব খুব অস্পষ্ট।

পদ্ধতি 3: প্রতি এন সেকেন্ডে একটি কীফ্রেম inোকান ( সম্ভবত? ):

-force_key_frames expr:gte(t,n_forced*GOP_LEN_IN_SECONDS)

এই হয় বিষদ বিবরণ। তবে "টাইম কাউন্টার" প্রতিটি কী ফ্রেমের পরে পুনরায় চালু হয় কিনা তা তাত্ক্ষণিকভাবে পরিষ্কার নয়। উদাহরণস্বরূপ, একটি প্রত্যাশিত 5-সেকেন্ডের জিওপি-তে, যদি কোনও scenecutকীফ্রেম যদি 3 সেকেন্ডে লাইবক্স 264৪ ইনজেকশন থাকে, তবে পরবর্তী কীফ্রেমটি 5 সেকেন্ড পরে বা 2 সেকেন্ড পরে হবে?

প্রকৃতপক্ষে, এফএফপিপিগ ডকুমেন্টেশনগুলি এই এবং -gবিকল্পের মধ্যে পার্থক্য করে , তবে এটি সত্যই বলে না যে উপরের এই দুটি বিকল্পটি কীভাবে কমপক্ষে কিছুটা আলাদা (স্পষ্টতই, -gএকটি নির্দিষ্ট ফ্রেমের হার প্রয়োজন) require

যা সঠিক?

মনে হবে যে -force_key_framesউচ্চতর হবে , এটি একটি নির্দিষ্ট ফ্রেম রেট প্রয়োজন হয় না করবে। যাইহোক, এটি প্রয়োজন

  • এটি H.264 ( যদি থাকে তবে ) এর জিওপি স্পেসিফিকেশনের সাথে সামঞ্জস্য করে
  • এটি গ্যারান্টি দেয় যে লাইবক্স ২64৪ scenecutকীফ্রেম নির্বিশেষে স্থির ক্যাডেনে একটি কীফ্রেম থাকবে।

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

অবশেষে, পদ্ধতি শুধু একটি হ্যাক মত মনে হয় । আমি আশা করি যে এই সঠিক উত্তর নয় বিপক্ষে।keyint

তথ্যসূত্র:

-force_key_framesপদ্ধতিটি ব্যবহার করে একটি উদাহরণ

keyintপদ্ধতিটি ব্যবহার করে একটি উদাহরণ

FFmpeg উন্নত ভিডিও বিকল্প বিভাগ

উত্তর:


27

টি এল; ডিআর

আমি নিম্নলিখিতটি সুপারিশ করব:

  • libx264: (এবং optionচ্ছিকভাবে যোগ করুন )-g X -keyint_min X-force_key_frames "expr:gte(t,n_forced*N)"
  • libx265: -x265-params "keyint=X:min-keyint=X"
  • libvpx-vp9: -g X

Xফ্রেমের ব্যবধানটি কোথায় এবং Nকয়েক সেকেন্ডের ব্যবধান। উদাহরণস্বরূপ, 30fps ভিডিওর সাথে 2-সেকেন্ড ব্যবধানের জন্য, X= 60 এবং N= 2।

বিভিন্ন ফ্রেমের ধরণের সম্পর্কে একটি নোট

এই বিষয়টিকে সঠিকভাবে ব্যাখ্যা করার জন্য, প্রথমে আমাদের দুটি ধরণের আই-ফ্রেম / কীফ্রেমগুলি সংজ্ঞায়িত করতে হবে:

  • তাত্ক্ষণিক ডিকোডার রিফ্রেশ (আইডিআর) ফ্রেম: এটি আইডিআর ফ্রেমের আগের ফ্রেমগুলিতে অ্যাক্সেস ছাড়াই নিম্নলিখিত ফ্রেমের স্বাধীন ডিকোডিংয়ের অনুমতি দেয়।
  • আইডিআরবিহীন ফ্রেম: ডিকোডিংয়ের কাজ করার জন্য এগুলির জন্য পূর্ববর্তী আইডিআর ফ্রেম দরকার। নন-আইডিআর ফ্রেমগুলি কোনও জিওপি (ছবির গ্রুপ) এর মাঝখানে দৃশ্যের কাটগুলির জন্য ব্যবহার করা যেতে পারে।

স্ট্রিমিংয়ের জন্য কী সুপারিশ করা হয়?

স্ট্রিমিং কেসের জন্য, আপনি এটি করতে চান:

  • নিশ্চিত হয়ে নিন যে সমস্ত আইডিআর ফ্রেমগুলি নিয়মিত পজিশনে রয়েছে (যেমন 2, 4, 6,… সেকেন্ডে) যাতে ভিডিওটি সমান দৈর্ঘ্যের অংশগুলিতে বিভক্ত হয়ে যায়।
  • কোডিং দক্ষতা / গুণমানকে উন্নত করার জন্য দৃশ্য কাটা সনাক্তকরণ সক্ষম করুন। এর অর্থ হ'ল আই-ফ্রেমগুলিকে আইডিআর ফ্রেমগুলির মধ্যে স্থাপন করতে দেওয়া। আপনি এখনও দৃশ্যের কাট সনাক্তকরণ অক্ষম করে কাজ করতে পারেন (এবং এটি অনেক গাইডের অংশ, এখনও), তবে এটি প্রয়োজনীয় নয়।

পরামিতিগুলি কী করে?

এনকোডারটি কনফিগার করতে, কীফ্রেম প্যারামিটারগুলি কী করে তা আমাদের বুঝতে হবে। আমি কিছু পরীক্ষার করেনি এবং নিম্নলিখিত আবিষ্কৃত তিনটি এনকোডার জন্য libx264, libx265এবং libvpx-vp9FFmpeg মধ্যে:

  • libx264:

    • -g কীফ্রেম ব্যবধান সেট করে।
    • -keyint_min সর্বনিম্ন কীফ্রেম ব্যবধান সেট করে।
    • -x264-params "keyint=x:min-keyint=y"হিসাবে একই -g x -keyint_min y
    • দ্রষ্টব্য: উভয়কে একই মান হিসাবে সেট করার সময়, সর্বনিম্ন অভ্যন্তরীণভাবে কোডের মধ্যে দেখা হিসাবে, সর্বোচ্চ অন্তর অন্তত অর্ধেক সেট করা হয় x264:

      h->param.i_keyint_min = x264_clip3( h->param.i_keyint_min, 1, h->param.i_keyint_max/2+1 );
      
  • libx265:

    • -g বাস্তবায়িত হয় না।
    • -x265-params "keyint=x:min-keyint=y" কাজ করে।
  • libvpx-vp9:

    • -g কীফ্রেম ব্যবধান সেট করে।
    • -keyint_min সর্বনিম্ন কীফ্রেম ব্যবধান সেট করে
    • দ্রষ্টব্য: FFmpeg কীভাবে কাজ করে তার কারণে -keyint_minকেবলমাত্র এনকোডারটিতে ফরোয়ার্ড করা হয় যখন এটি একই হয় -g। কোড থেকে libvpxenc.cআমরা জানতে পারেন FFmpeg মধ্যে:

      if (avctx->keyint_min >= 0 && avctx->keyint_min == avctx->gop_size)
          enccfg.kf_min_dist = avctx->keyint_min;
      if (avctx->gop_size >= 0)
          enccfg.kf_max_dist = avctx->gop_size;
      

      এটি সম্ভবত কোনও বাগ (বা বৈশিষ্ট্যের অভাব?) হতে পারে, যেহেতু libvpxঅবশ্যই এটির জন্য আলাদা মান নির্ধারণকে সমর্থন করে kf_min_dist

আপনার ব্যবহার করা উচিত -force_key_frames?

-force_key_framesবিকল্প জোরপূর্বক দেওয়া অন্তর (অভিব্যক্তি) এ কীফ্রেমগুলি সন্নিবিষ্ট করে। এটি সমস্ত এনকোডারদের জন্য কাজ করে তবে এটি হার নিয়ন্ত্রণ ব্যবস্থার সাথে ঝামেলা জাগতে পারে। বিশেষত ভিপি 9-র জন্য, আমি মারাত্মক মানের ওঠানামা লক্ষ্য করেছি, তাই আমি এই ক্ষেত্রে এটি ব্যবহারের পরামর্শ দিতে পারি না।


ধন্যবাদ! এটি দুর্দান্ত প্রতিক্রিয়া। আমার একটি প্রশ্ন হ'ল আপনি কীভাবে সেই দুর্দান্ত টেবিলটি তৈরি করেছেন। আমি সম্পূর্ণরূপে কিছু ব্যবহার করতে পারে।
চিহ্নিত করুন গেরোলিমাটোস

(আপনাকে সরাসরি লেখার কোনও উপায় নেই বলে মনে হয়) আপনি কি দয়া করে আমাকে এই আইটিইউ-টি আলোচনার কোনও থ্রেডের লিঙ্কগুলির দিকে নির্দেশ করতে পারেন? ধন্যবাদ!
মার্ক জেরোলিমাটোস

2
আমি কেবল এক্সেল এ এটি তৈরি করেছি, আউটপুট আটকে আমি তিনটি রান থেকে পেয়েছি ffprobe -i input.mp4 -select_streams v -show_frames -of csv -show_entries frame=pict_type, তারপরে ঘরগুলি রঙ করে ing আমি আশঙ্কা করছি যে কোনও জনসম্পর্কিত আলোচনা নেই, তবে আমি দেখতে পাচ্ছিলাম যে আমি তখনকার লিঙ্কগুলির কয়েকটি খনন করতে পারি।
slhck

আপনি কি দয়া করে -force_key_frames expr:gte(t,n_forced*GOP_LEN_IN_SECONDS)ফর্মটি দিয়ে নিজের পরীক্ষাটি আবার চেষ্টা করতে পারেন ? আমি কেবল এটি চেষ্টা করে দেখেছি যে স্রোতে অতিরিক্ত ফ্রেম থাকাকালীন এটি আমার নিয়ম মেনে চলেছে বলে মনে হচ্ছে। একটি PERL প্রোগ্রাম "উত্তর" হিসাবে অনুসরণ করবে, কারণ আপনি মন্তব্যগুলিতে স্পষ্টতই মার্কআপ ব্যবহার করতে পারবেন না।
মার্ক জেরোলিমাটোস

মজাদার. আমি বিশ্বাস করি যে এটি কার্যকর হয় যদি আপনি জানতে পারেন যে এটি একটি পৃথক "বাস্তব" উত্তর মূল্যবান। (স্ট্যাক এক্সচেঞ্জের সাইটগুলি এই আলোচনার স্টাইলের উত্তরের জন্য সত্যিই ভাল নয়)) শেষ বার যাচাই করেছিলাম, -force_key_framesআমার পক্ষে কাজ করে নি, এবং তাই আর কখনও চেষ্টা করে দেখিনি। এটি এক বছর আগেও ছিল। সম্ভবত এটি একটি বাগ ছিল। আমি শীঘ্রই আবার চেষ্টা করব।
slhck

12

মামলার জন্য আমার পঞ্চাশ সেন্ট এখানে।

পদ্ধতি 1:

libx264 এর যুক্তি নিয়ে গণ্ডগোল

-সি: ভি libx264 -x264opts কীন্ট = GOPSIZE: মিনিট-কীিন্ট = গোপসিজ: পরিস্থিতি = -1

শুধুমাত্র কাঙ্ক্ষিত বিরতিতে iframes তৈরি করুন।

উদাহরণ 1:

ffmpeg -i test.mp4 -codec:v libx264 \
-r 23.976 \
-x264opts "keyint=48:min-keyint=48:no-scenecut" \
-c:a copy \
-y test_keyint_48.mp4

এটি প্রত্যাশার মতো iframes উত্পন্ন করুন:

Iframes     Seconds
1           0
49          2
97          4
145         6
193         8
241         10
289         12
337         14
385         16
433         18
481         20
529         22
577         24
625         26
673         28
721         30
769         32
817         34
865         36
913         38
961         40
1009        42
1057        44
1105        46
1153        48
1201        50
1249        52
1297        54
1345        56
1393        58

পদ্ধতি 2 অবমূল্যায়ন করা হয়। Ommitted।

পদ্ধতি 3:

প্রতি এন সেকেন্ডে একটি কীফ্রেম sertোকান (মায়াবী):

-ফোর্স_কি_ফ্রেমস এক্সপ্রেস: জিটি (টি, এন_ ফোর্সড * জিওপি_এলএন_IN_SECONDS)

উদাহরণ 2

ffmpeg -i test.mp4 -codec:v libx264 \
-r 23.976 \
-force_key_frames "expr:gte(t,n_forced*2)"
-c:a copy \
-y test_fkf_2.mp4

কিছুটা ভিন্ন উপায়ে আইফ্রেমেস তৈরি করুন:

Iframes     Seconds
1           0
49          2
97          4
145         6
193         8
241         10
289         12
337         14
385         16
433         18
481         20
519         21.58333333
529         22
577         24
625         26
673         28
721         30
769         32
817         34
865         36
913         38
931         38.75
941         39.16666667
961         40
1008        42
1056        44
1104        46
1152        48
1200        50
1248        52
1296        54
1305        54.375
1344        56
1367        56.95833333
1392        58
1430        59.58333333
1440        60
1475        61.45833333
1488        62
1536        64
1544        64.33333333
1584        66
1591        66.29166667
1632        68
1680        70
1728        72
1765        73.54166667
1776        74
1811        75.45833333
1824        75.95833333
1853        77.16666667
1872        77.95833333
1896        78.95833333
1920        79.95833333
1939        80.75
1968        81.95833333

আপনি দেখতে পাচ্ছেন যে এটি প্রতি 2 সেকেন্ডে এবং সংমিশ্রণে (ভাসমান অংশ সহ সেকেন্ড) আইফ্রেমেস রাখে যা আমার মতে ভিডিও স্ট্রিম জটিলতার জন্য গুরুত্বপূর্ণ।

জেনারেটেড ফাইলের আকারগুলি একই রকম। খুব আশ্চর্যের বিষয় যে এমনকি পদ্ধতি 3 এ আরও কীফ্রেমগুলি সহ এটি কখনও কখনও স্ট্যান্ডার্ড x264 লাইব্রেরি অ্যালগরিদমের চেয়ে কম ফাইল উত্পন্ন করে।

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

আশা করি এটি কাউকে সাহায্য করবে।


চমত্কার, আপনার 50 সেন্টের জন্য ধন্যবাদ!
ব্রুনোফেনজল

7

উত্তরটি তাই বলে মনে হচ্ছে:

  • পদ্ধতি 1 কাজ যাচাই করা হয়েছে, কিন্তু libx264-specific, এবং খুব দরকারী দূর খরচে আসে scenecutবিকল্পটি libx264
  • পদ্ধতি 3 এপ্রিল 2015 এর এফএফএমপিইগ সংস্করণ হিসাবে কাজ করে, তবে বিকল্পটির প্রভাব সম্পর্কে এফএফএমপিইজি ডকুমেন্টেশন অস্পষ্ট হওয়ায় আপনার পোস্টের নীচে অন্তর্ভুক্ত স্ক্রিপ্টটি দিয়ে আপনার ফলাফলগুলি যাচাই করা উচিত। যদি এটি কাজ করে তবে এটি দুটি বিকল্পের চেয়ে সেরা।
  • পদ্ধতি 2 ব্যবহার করবেন না, হতাশ -gবলে মনে হচ্ছে। এটি না কোনও কাজ করে বলে মনে হয়, না ডকুমেন্টেশনে এটি স্পষ্টভাবে সংজ্ঞায়িত হয়, না সাহায্যে পাওয়া যায় না, বা কোডটিতে এটি ব্যবহার করা দেখা যায় না। কোড পরিদর্শনটি দেখায় যে -gবিকল্পটি সম্ভবত এমপিইজি -2 স্ট্রিমগুলির জন্য বোঝানো হয়েছে (এখানে পল এবং এনটিএসসি উল্লেখ করে কোড স্টাঞ্জও রয়েছে!)।

এছাড়াও:

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

-force_key_framesবিকল্পের জন্য স্ক্রিপ্ট

Slhck এর ffprobe পরামর্শের ফলাফলের উপর ভিত্তি করে আমি একটি সংক্ষিপ্ত PERL প্রোগ্রামটি আই-ফ্রেম ক্যাডেন্সটি যাচাই করতে ব্যবহার করেছি। এটি যাচাই করে মনে হচ্ছে যে -force_key_framesপদ্ধতিটিও কাজ করবে এবং scenecutফ্রেমের অনুমতি দেওয়ার অতিরিক্ত সুবিধা রয়েছে । এফএফএমপিইগ কীভাবে এই কাজটি করে তা আমার সম্পূর্ণ ধারণা নেই, বা যদি আমি কেবল কোনওভাবেই বাইরে বেরিয়ে আসি কারণ আমার স্ট্রিমগুলি শর্তযুক্ত হওয়ার কারণে ঘটে।

আমার ক্ষেত্রে, আমি 30fps এ 6 সেকেন্ডের প্রত্যাশিত জিওপি আকার বা 180 ফ্রেমের সাথে এনকোড করেছি। আমি 180 টি এই প্রোগ্রামটির গোপ্সাইজ আর্গুমেন্ট হিসাবে 180 এর প্রতিটি একাধিকতে একটি আই ফ্রেম যাচাই করেছি, তবে এটি 181 এ সেট করা (বা অন্য কোনও সংখ্যা 180 এর একাধিক নয়) অভিযোগ করেছে।

#!/usr/bin/perl
use strict;
my $gopsize = shift(@ARGV);
my $file = shift(@ARGV);
print "GOPSIZE = $gopsize\n";
my $linenum = 0;
my $expected = 0;
open my $pipe, "ffprobe -i $file -select_streams v -show_frames -of csv -show_entries frame=pict_type |"
        or die "Blah";
while (<$pipe>) {
  if ($linenum > $expected) {
    # Won't catch all the misses. But even one is good enough to fail.
    print "Missed IFrame at $expected\n";
    $expected = (int($linenum/$gopsize) + 1)*$gopsize;
  }
  if (m/,I\s*$/) {
    if ($linenum < $expected) {
      # Don't care term, just an extra I frame. Snore.
      #print "Free IFrame at $linenum\n";
    } else {
      #print "IFrame HIT at $expected\n";
      $expected += $gopsize;
    }
  }
  $linenum += 1;
}

কেবলমাত্র একটি দ্রষ্টব্য: যেহেতু এটি একটি প্রশ্নোত্তর সাইট এবং সত্যই কোনও আলোচনার ফোরাম নয় যেখানে পোস্টগুলিকে কালানুক্রমিকভাবে আদেশ করা হয় , তাই সমস্ত তথ্যকে একটি উত্তরে রেখে দেওয়া ভাল, যাতে সমাধানের সন্ধানকারী লোকদের কেবল একটি পোস্ট পড়তে হবে এবং সন্ধান করতে হবে না কে পোস্ট করেছে, কখন :) আমি আপনার উত্তরগুলি একীভূত করেছি এবং আপনাকে এটিতে একটি +1 দিয়েছি। যেহেতু ক্রস পোস্টিং অনুমোদিত নয় , তাই আমি আপনাকে পরামর্শ দিচ্ছি যে আপনার প্রশ্নটি ভিডিও সাইটে মুছে ফেলুন। লোকেরা এখানে উত্তর (গুলি) খুঁজে পাবে।
slhck

1
আমার কেবল আরও একটি চিন্তাভাবনা ছিল (আসলে এটি এফএম্পপিগ মেলিং তালিকায় উত্থাপিত হয়েছিল)। আপনি যখন ব্যবহার করেন force_key_frames, এটি x264 বিট বরাদ্দকরণ অ্যালগরিদমকে গণ্ডগোল করে দেয়, তাই এটি কেবল একটি নির্দিষ্ট কীফ্রেম ব্যবধান সেট করার চেয়ে খারাপ মানের আপনাকে দিতে পারে।
5h15 এ্ল্যাক করুন

পবিত্র জঞ্জাল। তবুও এফএফএমপিইগের কোডেক-ননস্পেকফিক উপায় প্রদানের আরও একটি কারণ, একটি যুক্তি যা "প্রশ্নে কোডেকের জন্য সবচেয়ে ভাল কাজ করবে"। আমি এফএফএমপিইগির ট্র্যাকের জন্য এটির জন্য টিকিট দায়ের করার চেষ্টা করেছি, তবে বাউন্স করা হয়েছে :-(
মার্ক গেরোলিমাতোস

@ এসএলএইচইচকি: আপনি আরও বিশদ দিতে পারেন? আমি মে 2015 এ মেইলিং তালিকা সংরক্ষণাগারটি দেখেছি কিন্তু কিছুই খুঁজে পাইনি। নীচের লাইনটি "পদ্ধতি 3" সম্পর্কে ভুলে যাওয়া এবং "পদ্ধতি 1" এ আঁকতে হবে।
শিফার্সট্যাপেল

3
@ মারকগেরোলিমাটোস: সম্পর্কে -g, আপনি বলেছেন, "এটি কাজ করে না বলে মনে হয়, ... না কোডে এটি ব্যবহার করা হয় বলে মনে হয়"। আমি চেক করা এবং ইনপুট gমধ্যে সংরক্ষিত হয় avctx->gop_sizeএবং যে libx264 তোলে এটি ব্যবহার করুন: x4->params.i_keyint_max = avctx->gop_size;। আমি যখন এই উত্পন্ন উত্পন্ন টেস্ট ফাইলটি অনুসন্ধান ffmpeg -i a-test-file.mp4 -g 37 -t 15 gtest.mp4করব:, আমি ঠিক কী-ফ্রেমগুলি পাই 0,37,74,111,148,185,222,259,296,333,370। দৃশ্যের পরিবর্তনটি ট্রিগার করা হলে একটি জিওপি সংক্ষিপ্তভাবে কাটা যেতে পারে এবং এর জন্য -sc_thresholdসেটও করা যেতে পারে, যা এক্স 264৪ দ্বারাও নেওয়া হয়েছে।
জ্ঞান

4

আমি এখানে কিছু তথ্য যুক্ত করতে চেয়েছিলাম যেহেতু আমার গুগলিং আমার ডিএসএইচটি এনকোডিংয়ের যেভাবে চাইছিল সেগমেন্টে খোঁজার চেষ্টা করার জন্য তথ্য খুঁজতে আমার অনুসন্ধানে এই আলোচনাটিকে বেশ খানিকটা টেনে নিয়েছিল এবং আমি যে তথ্য পেয়েছি তা কোনওটিই সঠিক ছিল না।

পরিত্রাণ পেতে প্রথমে কয়েকটি ভুল ধারণা:

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

  2. -x264opts keyint=GOPSIZE:min-keyint=GOPSIZE← এটি যা আপনার মনে হয় তা করে না। এটি বের করতে আমার কিছুটা সময় লেগেছে। এটি min-keyintকোডের মধ্যে সীমাবদ্ধ আছে দেখা যাচ্ছে । এর থেকে বড় হওয়ার অনুমতি নেই (keyint / 2) + 1। সুতরাং এই দুটি ভেরিয়েবলের জন্য একই মান নির্ধারণের ফলে min-keyintএনকোডিংয়ের সময় অর্ধেক কমে যাওয়ার মান আসে।

এই জিনিসটি এখানে: দৃশ্য-কাটটি দুর্দান্ত especially এটি এটিকে সুন্দর এবং চকচকে রাখে, তাই আমি এটিকে অক্ষম করতে চাই না, তবে একই সাথে সক্ষম হওয়া পর্যন্ত আমি একটি স্থির জিওপি আকার পেতে পারি না। আমি দৃশ্য-কাটা সক্ষম করতে চেয়েছিলাম, তবে এটির জন্য কেবল আইডিআর নন-আইডিআর ব্যবহার করা উচিত। কিন্তু এটি কাজ করে না। আমি # 2 ভুল ধারণা সম্পর্কে (প্রচুর পড়া থেকে) সন্ধান না করা পর্যন্ত।

দেখা যাচ্ছে যে keyintআমার কাঙ্ক্ষিত জিওপি আকার দ্বিগুণ করতে আমার প্রয়োজন set এর অর্থ এটি min-keyintআমার কাঙ্ক্ষিত জিওপি আকারে সেট করা যেতে পারে (অভ্যন্তরীণ কোডটি এটি অর্ধেক না কেটে ছাড়াই), যা দৃশিত কাট সনাক্তকরণকে জিওপি আকারের মধ্যে আইডিআর আই-ফ্রেমগুলি ব্যবহার করা থেকে বিরত রাখে কারণ শেষ আইডিআর আই-ফ্রেমের ফ্রেম গণনা হ'ল সবসময় কম min-keyinit

এবং অবশেষে force_key_frameবিকল্পটি ডাবল আকারকে ওভাররাইড করে keyint। সুতরাং এখানে কি কাজ করে:

আমি বিভাগগুলিকে 2 সেকেন্ড খণ্ডগুলিতে পছন্দ করি তাই আমার GOPSIZE = ফ্রেমরেট * 2

ffmpeg <other_options> -force_key_frames "expr:eq(mod(n,<GOPSIZE>),0)" -x264opts rc-lookahead=<GOPSIZE>:keyint=<GOPSIZE * 2>:min-keyint=<GOPSIZE> <other_options>

আপনি ffprobe ব্যবহার করে যাচাই করতে পারেন:

ffprobe <SRC_FLE> -select_streams v -show_frames -of csv -show_entries frame=coded_picture_number,key_frame,pict_type > frames.csv

উত্পন্ন CSV ফাইলে প্রতিটি লাইন আপনাকে বলবে frame, [is_an_IDR_?], [frame_type], [frame_number]:

frame,1,I,60  <-- frame 60, is I frame, 1 means is an IDR I-frame (aka KeyFrame)
frame,0,I,71  <-- frame 71, is I frame, 0 means not an IDR I_frame

ফলাফলটি হ'ল আপনার কেবলমাত্র স্থির GOPSIZEবিরতিতে আইডিআর আই-ফ্রেমগুলি দেখতে পাওয়া উচিত , অন্যদিকে আই অন্যান্য ফ্রেমগুলি নন-আইডিআর আই-ফ্রেমগুলি দৃশ্য-কাটা সনাক্তকরণের জন্য প্রয়োজনীয় হিসাবে sertedোকানো হয়।


সেটা ছিল চমত্কার! এটি অত্যন্ত প্রতিকূল ছিল, চেষ্টা করার জন্য আপনাকে ধন্যবাদ। এবং সংক্ষেপে বলতে গেলে, আমি ধরে নিলাম আপনার "আই-ফ্রেম" এবং "আই-ফ্রেম" এর সংজ্ঞাটি ধারণামূলক (এটি libx264 তে স্পষ্টভাবে কনফিগারযোগ্য নয়), এবং আপনি যেভাবে "ম্যাক্স * 2" প্রয়োগ করেছিলেন তা কি?
মার্ক গেরোলিমাটোস

হ্যাঁ এটি ধারণাগত ছিল, যদিও আমি দেখেছি লোকেরা আইডিআর এবং নন-আইডিআর আই-ফ্রেমের মধ্যে পার্থক্য করতে "I" বনাম "i" ব্যবহার করে। এবং হ্যাঁ, কাঙ্ক্ষিত গোপ আকার * 2 তে কীনিট সেট করা গোপের অভ্যন্তরে থাকা সমস্ত ফ্রেমগুলিকে নন-আইডিআর আই-ফ্রেম হিসাবে বাধ্য করার একটি উপায়। তারপরে x264opts এ ffmpeg-ফোর্স-কি-ফ্রেমগুলি ওভার-রাইড কী-ইন করুন। মূলত এটি পছন্দসই ফলাফলটি পাওয়ার পিছনের দিকে যা সম্ভব হবে যদি x264 কোড আপনাকে ন্যূনতম কীনিট এবং কীনিটকে একই মানতে সেট করার অনুমতি দেয়।
রূবেণ

... উভয়ই সক্ষম হওয়ার পরে দৃশ্যের কাট সনাক্তকরণ চালু রাখতে এবং স্থির GOP আকার পান।
রূবেণ

আপনার দুর্দান্ত কাজের জন্য আবার ধন্যবাদ! এটির প্রভাবিত করার মতো আমাদের যেমন "পিছনের দিকের" প্রয়োজন কম মনে হচ্ছে
মার্ক গেরোলিমাটোস

এখানে কি আরসি-লুকের দরকার আছে? এটি এমবিট্রি এবং ভিবিভিতে প্রভাব ফেলে তবে এটি আই-ফ্রেম জেনারেশনকে প্রভাবিত করে?
আলেকজান্ডার শেভটকিন

0

দেখে মনে হচ্ছে এই সিনট্যাক্সটি সবসময় কাজ করে না .. আমি আমাদের ভিওডি কনটেন্টের পাশাপাশি লাইভ কন্টেন্ট (ফাইল ডাম্প) এবং অনেক সময় সিনস্যাকট কাজ করে না এবং আইফ্রেমে একটি অন্তর্নির্মিত ট্রিগারটি বেশ পরীক্ষা করে দেখেছি:

আই -50-> পি 50 আপকোভারশন, 2 সেকেন্ড জিপ / বিভাগ, আইডিআর শুরুতে সিনট্যাক্স, প্রয়োজনে ইনফেটাম ইনফ্রেমস

ffmpeg.exe -loglevel verbose -i avc_50i.ts -pix_fmt yuv420p -filter_complex yadif=1,scale=1920:1080 -vcodec libx264 -preset fast -x264-params "rc-lookahead=100:keyint=200:min-keyint=100:hrd=1:vbv_maxrate=12000:vbv_bufsize=12000:no-open-gop=1" -r 50 -crf 22 -force_key_frames "expr:eq(mod(n,100),0)" -codec:a aac -b:a 128k -y target.ts

0

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

আপনি যদি রিয়েল-টাইম স্ট্রিমিং না করে থাকেন তবে আপনার আরও বিলাসিতা রয়েছে। 'সঠিক' উপায়টি সম্ভবত-জি-র সাথে নির্দিষ্ট জিওপি আকারের সাথে একটি রেজোলিউশনে এনকোড করা এবং তারপরে একই জায়গায় কীফ্রেমগুলি বাধ্য করার জন্য অন্যান্য রেজোলিউশনগুলি এনকোড করা।

আপনি যদি এটি করতে চেয়েছিলেন, আপনি কীফ্রেম বার পেতে ffprobe ব্যবহার করতে পারেন এবং তারপরে একটি শেল স্ক্রিপ্ট বা একটি বাস্তব প্রোগ্রামিং ভাষা ব্যবহার করে এটিকে একটি ffmpeg কমান্ডে রূপান্তর করতে পারেন।

তবে বেশিরভাগ সামগ্রীর জন্য, প্রতি 5 সেকেন্ডে একটি কীফ্রেম এবং প্রতি 5 সেকেন্ডে দুটি কীফ্রেম (এক জোর করে এবং পরিস্থিতি থেকে একজন) এর মধ্যে খুব কম পার্থক্য রয়েছে। এটি পি আই ফ্রেম এবং বি-ফ্রেমের আকার বনাম গড় আই-ফ্রেম আকারের প্রায়। আপনি যদি টিপিকাল সেটিংস সহ x264 ব্যবহার করেন (কেবলমাত্র আমি মনে করি যে এগুলি প্রভাবিত করার জন্য আপনার কিছু করা উচিত তবেই যদি আপনি -কিউন সেট করেন তবে সহজ সামগ্রীটিতে বিটরেট ব্যবহার করা থেকে x264 প্রতিরোধের একটি ক্ষুদ্র উপায় হিসাবে; এটি সমস্ত ফ্রেমের প্রকারকে একই মান হিসাবে সীমাবদ্ধ করে , আমি মনে করি) এবং আই-ফ্রেম গড় আকার 46 কেবি, পি-ফ্রেম 24 কেবি, বি-ফ্রেম 17 কেবি (পি-ফ্রেমের প্রায় অর্ধেক অর্ধেক) এর মতো ফলাফল পান, তারপরে প্রতি সেকেন্ডে 30 fps এ অতিরিক্ত আই-ফ্রেম পাবেন ফাইল আকারে কেবল 3% বৃদ্ধি। H264 এবং h263 এর মধ্যে পার্থক্যটি 3% হ্রাসের একগুচ্ছ তৈরি হতে পারে তবে এককটি খুব গুরুত্বপূর্ণ নয়।

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

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

Ffmpeg -g বিকল্প বা অন্য যে কোনও এনকোডার বিকল্পটি আপনি ব্যবহার করেন তা এনকোডার-নির্দিষ্ট বিকল্পটিতে ম্যাপ করা হয়। সুতরাং '-x264-params keyint = GOPSIZE' '-g GOPSIZE' এর সমতুল্য।

দৃশ্য সনাক্তকরণ ব্যবহারের ক্ষেত্রে একটি সমস্যা হ'ল যদি আপনি যে কোনও কারণে নির্দিষ্ট সংখ্যার নিকটে কীফ্রেমগুলি পছন্দ করেন। আপনি যদি প্রতি 5 সেকেন্ডে কীফ্রেমগুলি নির্দিষ্ট করে এবং দৃশ্যের সনাক্তকরণ ব্যবহার করেন এবং সেখানে 4.5 এর দৃশ্যপট পরিবর্তিত হয় তবে এটি সনাক্ত করা উচিত তবে পরবর্তী কিফ্রেমটি 9.5 এ হবে। সময়টি যদি এভাবেই বাড়তে থাকে তবে আপনি 40, 45, 50, 55 এর পরিবর্তে 42.5, 47.5, 52.5 ইত্যাদিতে কীফ্রেমগুলি দিয়ে শেষ করতে পারেন Con বিপরীতভাবে, যদি 5.5-এ কোনও দৃশ্যের পরিবর্তন হয় তবে সেখানে উপস্থিত হবে 5 এবং 5.5-তে একটি কীফ্রেম অন্য একটির জন্য খুব তাড়াতাড়ি হবে। Ffmpeg আপনাকে "পরবর্তী 30 ফ্রেমের মধ্যে কোনও দৃশ্যের পরিবর্তন না হলে এখানে একটি কীফ্রেম তৈরি করতে" নির্দিষ্ট করতে দেয় না। সি বোঝে এমন কেউ যদিও এই বিকল্পটি যুক্ত করতে পারে।

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

প্রক্রিয়াটি সম্ভবত একটি টেস্ট ভিডিও করতে হবে যা কেবল কীফ্রেম পরিবর্তনের জন্যই হয়, তবে 2-পাস ব্যবহার করতে পারলে রেট নিয়ন্ত্রণের ডেটা ব্যবহার করা যেতে পারে। (উত্সাহিত ডেটা বিভিন্ন রেজোলিউশন এবং সেটিংসের জন্য আদৌ কার্যকর কিনা তা নিশ্চিত নয়; ম্যাক্রোব্লক-ট্রি ডেটা হবে না)) এটিকে ধ্রুবক-ফ্রেমরেট ভিডিওতে রূপান্তর করুন, তবে ফ্রেমরেটকে অর্ধেক করার সময় স্টাটারিং আউটপুট সম্পর্কে এই বাগটি দেখুন যদি আপনি কখনও সিদ্ধান্ত নেন অন্যান্য উদ্দেশ্যে fps ফিল্টার ব্যবহার করতে। আপনার পছন্দসই কীফ্রেম এবং জিওপি সেটিংস সহ এটি x264 এর মাধ্যমে চালান।

তারপরে কেবলমাত্র আসল ভেরিয়েবল ফ্রেম-রেট ভিডিও সহ এই কীফ্রেমের সময়গুলি ব্যবহার করুন।

যদি আপনি ফ্রেমগুলির মধ্যে 20-সেকেন্ড ফাঁক দিয়ে সম্পূর্ণ ক্রেজি ব্যবহারকারী-উত্পাদিত সামগ্রীটিকে অনুমতি দেন তবে চলক ফ্রেম-রেট এনকোডের জন্য, আপনি আউটপুট বিভক্ত করতে পারেন, fps ফিল্টার ব্যবহার করতে পারেন, কোনওভাবে ফিল্টার নির্বাচন করতে পারেন (সম্ভবত একটি দীর্ঘ দীর্ঘ এক্সপ্রেশন তৈরি করতে পারে যা প্রতি কিফ্রেমের সময়) ... বা সম্ভবত আপনি পরীক্ষার ভিডিওটিকে ইনপুট হিসাবে ব্যবহার করতে পারেন এবং কেবলমাত্র ক্রেফ্রেমগুলি ডিকোড করতে পারেন, যদি সেই ffmpeg বিকল্পটি কাজ করে, বা কীফ্রেমগুলি নির্বাচন করতে নির্বাচিত ফিল্টারটি ব্যবহার করুন। তারপরে এটিকে সঠিক আকারে স্কেল করুন (এটির জন্য একটি স্কেল 2 রিফ ফিল্টার রয়েছে) এবং এতে মূল ভিডিওটি ওভারলে করুন। তারপরে মূল ভিডিওর সাথে এই গন্তব্য থেকে বাধ্যতামূলক কীফ্রেমগুলি একত্রিত করতে ইন্টারলিও ফিল্টারটি ব্যবহার করুন। যদি এর ফলে দুটি ফ্রেমের ফলাফল হয় যা 0.001 সেকেন্ডের বাইরে থাকে যে ইন্টারলিভ ফিল্টারটি প্রতিরোধ করে না, তবে এই সমস্যাটি নিজেই অন্য একটি নির্বাচিত ফিল্টার দিয়ে সমাধান করুন। ইন্টারলেভ ফিল্টারটির জন্য ফ্রেম বাফার সীমা নিয়ে কাজ করা এখানে মূল সমস্যা হতে পারে। এগুলি সমস্ত কাজ করতে পারে: ঘন স্রোত বাছাই করতে কোনও ধরণের ফিল্টার ব্যবহার করুন (ফিফো ফিল্টার?); একাধিকবার ইনপুট ফাইলটি উল্লেখ করুন যাতে এটি একাধিকবার ডিকোড হয় এবং ফ্রেমগুলি সংরক্ষণ করতে হয় না; 'স্ট্রিম সিলেক্ট' ফিল্টারটি ব্যবহার করুন, যা আমি কখনই করি নি, কী-ফ্রেমের ঠিক সময়ে; ইন্টারলিভ ফিল্টারটি এর ডিফল্ট আচরণ পরিবর্তন করে বা ফ্রেম বাদ দেওয়ার পরিবর্তে বাফারে সবচেয়ে পুরানো ফ্রেমটিকে আউটপুট দেওয়ার বিকল্প যুক্ত করে উন্নত করুন। কিফ্রেমগুলির ঠিক সময়ে, যা আমি কখনও করি নি; ইন্টারলিভ ফিল্টারটি এর ডিফল্ট আচরণ পরিবর্তন করে বা ফ্রেম বাদ দেওয়ার পরিবর্তে বাফারে সবচেয়ে পুরানো ফ্রেমটিকে আউটপুট দেওয়ার বিকল্প যুক্ত করে উন্নত করুন। কিফ্রেমগুলির ঠিক সময়ে, যা আমি কখনও করি নি; ইন্টারলিভ ফিল্টারটি এর ডিফল্ট আচরণ পরিবর্তন করে বা ফ্রেম বাদ দেওয়ার পরিবর্তে বাফারে সবচেয়ে পুরানো ফ্রেমটিকে আউটপুট দেওয়ার বিকল্প যুক্ত করে উন্নত করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.