একটি ভিডিও স্ট্রিমের দ্রুত, ক্ষতিহীন সংক্ষেপণ


14

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

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

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

  • টানা দুটি ফ্রেমের মধ্যে বাইনারি পার্থক্য নিয়েছে। আসল তথ্য পরিসীমা 0 ~ 1023 (যেমন স্বাক্ষরযুক্ত 10 বিট)। পার্থক্য ডেটা স্বাক্ষরিত হয় এবং পরিসীমা -1023 ~ 1023 এ বৃদ্ধি পায় তবে তথ্য বৈচিত্র (বা সঠিক গাণিতিক শব্দটি কী) মূল তথ্যগুলির তুলনায় অনেক কম হয়ে যায়, বাস্তবে, বেশিরভাগ মানগুলি আশ্চর্যজনকভাবে শূন্যের কাছাকাছি হয় না are ।
  • পার্থক্যে চাল কোডিং করা হয়েছে। আমি যা বুঝতে পারি তা থেকে এটি বেশিরভাগ ছোট সংখ্যার মানগুলির ডেটা সেটগুলির জন্য ভাল পছন্দ বলে মনে হচ্ছে।

এটি আমাকে 1280x720 ফ্রেমের আকারে প্রায় 60% হ্রাস দেয়, এবং আমার পরীক্ষা পদ্ধতি (একক কোরের ভার্চুয়ালবক্সে লিনাক্স) প্রতি সেকেন্ডে 40 ডলার যেমন সংকোচন করতে পারে (বেশি অপ্টিমাইজেশন ছাড়াই)। এটি দুর্দান্ত নয়, তবে যুক্তিযুক্ত, আমি অনুমান করি (বা এটি হয়?)।

আরও ভাল উপায় আছে? কোন সাধারণ ভুল আমি করেছি? কোন সাধারণ পদক্ষেপ আমি মিস করেছি? উচ্চতর রেজোলিউশন ফ্রেমগুলি পরে ব্যবহার করা যেতে পারে - আমি কি আরও বড় ফ্রেমের মাপের জন্য আরও ভাল সংক্ষেপণের হার আশা করতে পারি?

UPD .:

  • আমি এই লাইব্রেরি রাইস এনকোডিংয়ের জন্য ব্যবহার করেছি। লাইব্রেরিটি খুব ধীর গতির (লেখক নিজে এটি সত্যিকারের ব্যবহারের পরিবর্তে শেখার জন্য কিছু হিসাবে বর্ণনা করেছেন) উদাহরণস্বরূপ এটি লুপগুলিতে বিট একের পর এক পড়ায় এবং লেখায় যা কার্য সম্পাদন করে kill প্রাথমিকভাবে এটি আমাকে 20 ডলার এফপিএস দিয়েছিল, কিছু প্রাথমিক বুনিয়াদীকরণের পরে এটি 40 এফপিএসে পরিণত হয়েছিল (উপরে উল্লিখিত হিসাবে), পরে আমি এটি আরও কিছুটা অনুকূলিত করেছিলাম, এটি 80 হয়ে গেছে That এটি ভেক্টরাইজেশন ছাড়াই একটি একক আই 7 কোরে রয়েছে।
  • ভেক্টরাইজেশনের ক্ষেত্রে, যদিও, দুর্ভাগ্যক্রমে আমি ভাত কোডটি ভেক্টরাইজ করার কোনও উপায়ের কথা ভাবতে পারি না (এমনকি এটি আদৌ সম্ভব কিনা তাও জানিনা - রাইস কোডে কোনও ডেটা খুঁজে পেলাম না, হাফম্যান কোড সম্পর্কে আমি যেটা খুঁজে পেতে পারি তাতে বোঝা যায় যে এটি ক্রমযুক্ত এবং কার্যকরভাবে ভেক্টরাইজ করা যায় না, এটি রাইস কোডের পাশাপাশি অন্যান্য পরিবর্তনশীল-দৈর্ঘ্যের কোডগুলিতে প্রয়োগ হতে পারে)।
  • আমি সম্পূর্ণ ভিন্ন পদ্ধতির চেষ্টাও করেছি: ডেটাটিকে ছোট ছোট টুকরো (যেমন into৪ পিক্সেলের মতো) মধ্যে ভাগ করুন এবং সাধারণ শূন্য দমন ব্যবহার করুন। আমরা একটি ব্লকে সর্বাধিক সংখ্যা পাই, ব্লকের শুরুতে এটি উপস্থাপনের জন্য প্রয়োজনীয় বিটের সংখ্যা লিখি (আমার ক্ষেত্রে এটির জন্য 4 অতিরিক্ত বিট প্রয়োজন ছিল), তারপরে ব্লকের সমস্ত সংখ্যা একই সংখ্যায় হ্রাস করুন বিট। আমি প্রত্যাশা করেছিলাম যে সংকোচনের হারটি খারাপ হবে, তবে যদি টুকরোগুলি ছোট হয় তবে তাদের মধ্যে অনেকেরই শোরগোল থাকবে না, সুতরাং তাদের বাইনারি পার্থক্যটি মূল্য প্রতি 4 ~ 6 বিটের মতো কিছুতে হ্রাস করা যেতে পারে, এবং এটি ছিল কেবলমাত্র রাইস কোডের চেয়ে প্রায় 5% খারাপ, যখন দ্বিগুণ দ্রুত হয়ে থাকে (যেমন, আমার ক্ষেত্রে 160 টি এফপিএস)। আমি এটি ভেক্টরাইজিং করার চেষ্টা করেছি, তবে আমি ভেক্টরাইজেশনকে স্তন্যপান করি, তাই সম্ভবত এর কারণেই আমি কেবল আরও গতি বাড়ানোর প্রায় x1.8 অর্জন করতে পারি।

নেতিবাচক সংখ্যায় নেতৃস্থানীয় জিরো নেই বলে আমি বাইনারি পার্থক্যের পরে এবং চাল / শূন্য দমন করার আগে জিগজ্যাগ এনকোডিং প্রয়োগ করেছি ।


আপনি h264 এর মতো একটি স্ট্যান্ডার্ড কোডেক ব্যবহার করতে পারেন যা 10 বিট মোড সমর্থন করে। "-Crf বা -qp কে 0-এ সেট করে x264 অবিরাম লস মোডে প্রিফেস সেটিংস দেয় তারপরে কেবল গতি / আকারের অনুপাতকে প্রভাবিত করে।" (তবে এটি বাস্তব সময়ের পারফরম্যান্সটি পরিচালনা করবে কিনা আমি জানি না)
কোডসইনচোস

@ কোডস ইনচাউস, এটি কেবল দুটি ফ্রেমের জন্য অনেক কিছু করবে?
হেডক্র্যাব

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

উত্তর:


4

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

রাইস কোডগুলি সম্ভবত দক্ষতা এবং গতির মধ্যে একটি ভাল ট্রেড অফ, তবে একটি স্ট্যাটিক হাফম্যান কোড (ভিডিও ডেটার নমুনায় আপনার দ্বারা প্রম্প্ট করা) আরও দক্ষ এবং সমান দ্রুত হতে পারে।

গতি হিসাবে, আপনার কোডটি ভেক্টরাইজড হচ্ছে কিনা তা নিশ্চিত করুন - হয় সংকলকটিকে স্বয়ং-ভেক্টরাইজ করার অনুমতি দেওয়ার জন্য সঠিক সংকলক পতাকা এবং কোড নিদর্শনগুলি ব্যবহার করে, বা কোডটি ভ্যাক্টর আন্তঃনীতি বা সমাবেশ ব্যবহারের জন্য হাতে লেখা দ্বারা ।

পরিশেষে, পিক্সেল প্রতি 8 বিট একটি সম্ভাবনা ডাউন ডাউন হয়? স্পষ্টতই এটি "ক্ষতিহীন" এর ক্ষেত্র ছেড়ে চলেছে, তবে এটি কেবল আপনার সংকুচিত আউটপুটটির আকার হ্রাস করবে না, এটি ভেক্টরাইজড কোডের সাহায্যে আপনার থ্রুপুটটিকে 2x পর্যন্ত বাড়িয়ে দেবে।


আমার ধারণা 10 ডাব্লুপিপি 8 থেকে হ্রাস করা সম্ভব নয়, তবে ইউটিএফ -8 একটি অক্ষর সঞ্চয় করতে 1 বা কখনও কখনও 2 বাইট ব্যবহার করে ঠিক তেমনভাবে, কম বিটগুলিতে ডেল্টা সংরক্ষণ করা সম্ভব। যদি ডেল্টাগুলি সর্বদা প্রায় 0 থাকে তবে সমস্ত 10 বিট পরিবর্তন হওয়া খুব কমই দেখা যায় এবং এগুলি সংরক্ষণ করার জন্য 1 বা 2 বাইট নির্ধারণের প্রচেষ্টার পক্ষে মূল্যবান।
gbjbaanb

@gbjbaanb রাইস কোডিংটি এটি সম্পাদন করে। বেশিরভাগ বদ্বীপগুলি ছোট হবে এবং এইভাবে কয়েকটি বিট ব্যবহার করবে।
hobbs 9

@ হোবস, "স্থানিক পূর্বাভাস" দ্বারা আপনি কি x5পার্থক্য সহ একটি পিক্সেল মান প্রতিস্থাপনের মতো কিছু বোঝাতে চাইছেন (x5 - x4)?
হেডক্র্যাব

@ হ্যাডক্র্যাব - এমন একটি পদ্ধতি যা আমি আগে ব্যবহার করেছি তা হ'ল পূর্ববর্তী পিক্সেলের মাঝারি মান এবং উপরের এবং বাম পিক্সেলগুলি বর্তমান ফ্রেমে ব্যবহার করা।
জুলে

@ জুলস যদি কোনও পিক্সেল আশেপাশের পিক্সেলের এক ধরণের মাঝারি মানের দ্বারা প্রতিস্থাপিত হয় তবে এর মূল মানটি কি পুনরুদ্ধার করা সম্ভব?
হেডক্র্যাব

0

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


libx264 "প্রিসেট আল্ট্রাফাস্ট" historতিহাসিকভাবে আমার
FWIW

@ আরগারডপ্যাক - এটি লক্ষণীয় যে লাইবক্স ২64৪ এর সেটিং লসলেস এনকোডিংয়ের ফলাফল এমন একটি আউটপুট যা এইচ .২64৪ এর অনুগত নয় এবং কিছু খেলোয়াড়কে বিরতি দেয় in তবে এটি কমপক্ষে ওপি-র প্রয়োগের জন্য কার্যকর হতে পারে।
জুলাই

আকর্ষণীয় আপনার কোন লিঙ্ক আছে? বাগ রিপোর্ট? আরও মনে রাখবেন যে হাফিওয়াইউভির সাথে এনকোড করা একটি ভিডিও সম্ভবত "ইউনি প্লেয়ার বান্ধব" নয়, তা আমি কল্পনাও করছিলাম :)
রজারডপ্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.