FFmpeg ব্যবহার করে VP9 এর সাথে লাইভ এনকোডিং

এনকোডিং পরামিতি

VP9 লাইভ এনকোডিং অপ্টিমাইজ করতে পরামিতিগুলির একটি পরিসীমা প্রদান করে৷ এর কিছু বিস্তৃত নীতি বিটরেট মোডে আলোচনা করা হয়েছে।

FFmpeg VP9 এনকোডিং উদাহরণ

নীচের টেবিলটি VP9 এনকোডিংয়ের জন্য একটি উদাহরণ ffmpeg কলের প্যারামিটারগুলি বর্ণনা করে।

প্যারামিটার বর্ণনা
-quality realtime লাইভ স্ট্রিমিং এবং 5 এর উপরে গতির জন্য realtime অপরিহার্য।
-speed 6 লাইভ/রিয়েল-টাইম এনকোডিংয়ের জন্য গতি 5 থেকে 8 ব্যবহার করা উচিত। নিম্ন সংখ্যা ( 5 বা 6 ) উচ্চ মানের কিন্তু আরো CPU শক্তি প্রয়োজন। উচ্চতর সংখ্যাগুলি ( 7 বা 8 ) নিম্ন মানের হবে তবে কম লেটেন্সি ব্যবহারের ক্ষেত্রে এবং মোবাইলের মতো নিম্ন CPU পাওয়ার ডিভাইসগুলির জন্য আরও পরিচালনাযোগ্য।
-tile-columns 4 টাইলিং ভিডিওটিকে আয়তক্ষেত্রাকার অঞ্চলে বিভক্ত করে, যা এনকোডিং এবং ডিকোডিংয়ের জন্য মাল্টি-থ্রেডিংয়ের অনুমতি দেয়। টাইলস সংখ্যা সবসময় দুই একটি শক্তি. 0 = 1 টালি, 1 = 2, 2 = 4, 3 = 8, 4 = 16, 5 = 32।
-frame-parallel 1 সমান্তরাল ডিকোডেবিলিটি বৈশিষ্ট্যগুলি সক্ষম করুন৷
-threads 8 ব্যবহার করার জন্য সর্বাধিক সংখ্যক থ্রেড।
-static-thresh 0 গতি সনাক্তকরণ থ্রেশহোল্ড।
-max-intra-rate 300 সর্বোচ্চ আই-ফ্রেম বিটরেট (pct)
-deadline realtime -quality realtime বিকল্প (লেগেসি) সংস্করণ
-lag-in-frames 0 ল্যাগ করার জন্য সর্বাধিক ফ্রেমের সংখ্যা
-qmin 4 -qmax 48 কোয়ান্টাইজারের জন্য সর্বনিম্ন এবং সর্বোচ্চ মান। এখানে মানগুলি নিছক একটি পরামর্শ এবং এটি সামঞ্জস্য করা কম্প্রেশন দক্ষতার খরচে ভিডিওর গুণমান বাড়াতে/কমাতে সাহায্য করবে৷
-row-mt 1 সারি-মাল্টিথ্রেডিং সক্ষম করুন। টাইল কলাম হিসাবে 2x পর্যন্ত থ্রেড ব্যবহারের অনুমতি দেয়। 0 = বন্ধ, 1 = চালু।
-error-resilient 1 ত্রুটি স্থিতিস্থাপকতা বৈশিষ্ট্য সক্ষম করুন.

এনকোডিং পরামিতি নির্বাচন করা হচ্ছে

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

কীভাবে VP9 ম্যানিপুলেট করা যায় সে সম্পর্কে আরও বিশদ বিবরণের জন্য এটি ভিওডি সেটিংসের সাথে থাকা নিবন্ধটি উল্লেখ করার মতো, কিন্তু CBR-এর উপর ফোকাস বিবেচনায় নেওয়া।

কৌশল

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

কর্মে এনকোডিং পরামিতিগুলির উদাহরণ

নিম্নলিখিতগুলি লিনাক্সে চলমান একটি কোয়াড-কোর i5 3.6Ghz ডেস্কটপে বিভিন্ন ফ্রেমের আকারের জন্য 25 fps-এ CPU ব্যবহার দেখায়:

টার্গেট রেজোলিউশন FFmpeg VP9 পরামিতি CPU / গতি (উদাহরণ)
3840x2160 (2160p) -r 30 -g 90 -s 3840x2160 -গুণমান রিয়েলটাইম -স্পীড 5 -থ্রেড 16 -সারি-mt 1 -টাইল-কলাম 3 -ফ্রেম-সমান্তরাল 1 -qmin 4 -qmax 48 -b:v 7800k ~88% 0.39x
2560x1440 (1440p) -r 30 -g 90 -s 2560x1440 -গুণমান রিয়েলটাইম -স্পীড 5 -থ্রেড 16 -সারি-mt 1 -টাইল-কলাম 3 -ফ্রেম-সমান্তরাল 1 -qmin 4 -qmax 48 -b:v 6000k ~86% 0.68x
1920x1080 (1080p) -r 30 -g 90 -s 1920x1080 -গুণমান রিয়েলটাইম -স্পীড 5 -থ্রেড 8 -সারি-mt 1 -টাইল-কলাম 2 -ফ্রেম-সমান্তরাল 1 -qmin 4 -qmax 48 -b:v 4500k ~82% 1.04x
1280x720 (720p) -r 30 -g 90 -s 1280x720 -গুণমান রিয়েলটাইম -স্পীড 5 -থ্রেড 8 -সারি-mt 1 -টাইল-কলাম 2 -ফ্রেম-সমান্তরাল 1 -qmin 4 -qmax 48 -b:v 3000k ~78% 1.77x
854x480 (480p) -r 30 -g 90 -s 854x480 -গুণমান রিয়েলটাইম -স্পীড 6 -থ্রেড 4 -সারি-mt 1 -টাইল-কলাম 1 -ফ্রেম-সমান্তরাল 1 -qmin 4 -qmax 48 -b:v 1800k ~64% 3.51x
640x360 (360p) -r 30 -g 90 -s 640x360 -গুণমান রিয়েলটাইম -স্পীড 7 -থ্রেড 4 -সারি-mt 1 -টাইল-কলাম 1 -ফ্রেম-সমান্তরাল 0 -qmin 4 -qmax 48 -b:v 730k ~62% 5.27x
426x240 (240p) -r 30 -g 90 -s 426x240 -গুণমান রিয়েলটাইম -স্পীড 8 -থ্রেড 2 -সারি-mt 1 -টাইল-কলাম 0 -ফ্রেম-সমান্তরাল 0 -qmin 4 -qmax 48 -b:v 365k ~66% 8.27x

একটি উদাহরণ FFmpeg এর মতো দেখতে পারে:

ffmpeg -stream_loop 100 -i /home/id3as/Videos/120s_tears_of_steel_1080p.webm \
  -r 30 -g 90 -s 3840x2160 -quality realtime -speed 5 -threads 16 -row-mt 1 \
  -tile-columns 3 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 7800k -c:v vp9 \
  -b:a 128k -c:a libopus -f webm pipe1

কৌশল

  • মনে রাখবেন যে এখানে আমরা একটি FIFO পাইপে ("pipe1") আউটপুট করছি, যা কার্যকর করার আগে, FFmpeg কমান্ড চালানোর আগে তৈরি করা উচিত। এটি করার জন্য, আপনার ওয়ার্কিং ডিরেক্টরিতে mkfifo pipe1 কমান্ড দিন। শাকা প্যাকেজার ব্যবহার করার সময়, এটি প্রদত্ত স্ট্রিমের জন্য তার ইনপুট উত্স হিসাবে সেই পাইপটিকে শুনবে। অন্যান্য প্যাকেজিং মডেল একটি ভিন্ন পদ্ধতি প্রয়োজন হতে পারে.

  • -row-mt কমান্ডগুলি স্বীকৃত হয়েছে তা নিশ্চিত করতে, https://www.ffmpeg.org/download.html থেকে FFmpeg (বর্তমানে 3.3.3) এর সর্বশেষ স্থিতিশীল প্রকাশ ব্যবহার করুন

অভিযোজিত বিটরেট সেটের উদাহরণ

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

FFmpeg সম্পূর্ণ ABR সেট

একটি আদর্শ পরিস্থিতিতে আমরা একটি একক কমান্ড তৈরি করতে পূর্ববর্তী বিভাগে বর্ণিত এনকোডিং উদাহরণগুলিকে একত্রিত করি যা সেগুলি একই সময়ে তৈরি করে:

ffmpeg -stream_loop 100 -i lakes1080p.mp4 \
  -y -r 25 -g 75 -s 3840x2160 -quality realtime -speed 5 -threads 8 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 7800k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe1 \
  -y -r 25 -g 75 -s 2560x1440 -quality realtime -speed 5 -threads 8 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 6000k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe2 \
  -y -r 25 -g 75 -s 1920x1080 -quality realtime -speed 5 -threads 4 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 4500k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe3 \
  -y -r 25 -g 75 -s 1280x720 -quality realtime -speed 5 -threads 4 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 3000k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe4 \
  -y -r 25 -g 75 -s 854x480 -quality realtime -speed 6 -threads 4 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 2000k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe5 \
  -y -r 25 -g 75 -s 640x360 -quality realtime -speed 7 -threads 2 \
  -tile-columns 1 -frame-parallel 0 \
  -b:v 730k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe6 \
  -y -r 25 -g 75 -s 426x240 -quality realtime -speed 8 -threads 2 \
  -tile-columns 1 -frame-parallel 0 \
  -b:v 365k -c:v vp9 -b:a 64k -c:a libopus -f webm pipe7

উপরের সম্পূর্ণ সেটের জন্য, তবে, একটি খুব শক্তিশালী CPU প্রয়োজন হবে, অথবা সম্ভবত হার্ডওয়্যার GPU অফলোড থেকে সমর্থন যেমন কিছু চিপসেট ক্রমবর্ধমানভাবে প্রদান করে। Intel Kabylake (এবং এর বাইরে) একটি সম্পূর্ণ হার্ডওয়্যার এনকোডিং পাইপলাইন রয়েছে। (উল্লেখ্য যে Kabylake GPU 8-বিট VP9 এনকোড করতে পারে, কিন্তু 10-বিট নয়)।

শাকা প্যাকেজার ব্যবহার করে একটি ব্যবহারিক ডেস্কটপ উদাহরণ

সাধারণ ডেস্কটপ মেশিনের জন্য একটি আরো বাস্তব উদাহরণ শাকা প্যাকেজার ব্যবহার করতে পারে। Shaka সেটআপ করার একটি সহজ উপায় হল Google এর DockerHub ইমেজ ব্যবহার করে এটি একটি ডকার কন্টেইনারের মধ্যে ইনস্টল করা। নির্দেশনা পাওয়া যাবে এখানে:

https://github.com/google/shaka-packager#using-docker-for-testing--development

এই উদাহরণের জন্য, আমরা নিম্নলিখিত কনফিগারেশন সহ একটি মেশিন ব্যবহার করেছি:

পদ্ধতি হোস্ট: obs কার্নেল: 4.4.0-91-lowlatency x86_64 (64 বিট)
ডেস্কটপ Xfce 4.12.3 ডিস্ট্রো: OS: https://ubuntustudio.org/2016/10/ubuntu-studio-16-10-released/
সিপিইউ কোয়াড কোর ইন্টেল কোর i5-6500 (-MCP-)
ক্যাশে: 6144 KB
ঘড়ির গতি: সর্বোচ্চ: 3600 MHz 1: 800 MHz 2: 800 MHz 3: 800 MHz 4: 800 MHz
গ্রাফিক্স কার্ড ইন্টেল স্কাইলেক ইন্টিগ্রেটেড গ্রাফিক্স
স্মৃতি 8GB RAM

অনুশীলনে এই মেশিনটি সর্বোত্তমভাবে নিম্নলিখিত ব্যবহারযোগ্য ABR এনকোডের পরিসর তৈরি করতে পারে, FFmpeg ধারাবাহিকভাবে 1x এনকোড গতির প্রতিবেদন করে:

ffmpeg -stream_loop 100 -i 120s_tears_of_steel_1080p.webm \
  -y -r 30 -g 90 -s 1920x1080 -quality realtime -speed 7 -threads 8 \
  -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 \
  -b:v 4500k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe1 \
  -y -r 30 -g 90 -s 1280x720 -quality realtime -speed 8 -threads 6 \
  -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 \
  -b:v 3000k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe2 \
  -y -r 30 -g 90 -s 640x360 -quality realtime -speed 8 -threads 2 \
  -row-mt 1 -tile-columns 1 -frame-parallel 1 -qmin 4 -qmax 48 \
  -b:v 730k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe3

উল্লেখ্য যে -speed সেটিংস বেশ উচ্চ। এই সেটিংস পরীক্ষামূলকভাবে প্রতিষ্ঠিত হয়েছে এবং মেশিন থেকে মেশিনে পরিবর্তিত হবে

শাকা প্যাকেজার ওভারহেড

প্যাকেজিং একটি বিশেষভাবে CPU-নিবিড় কার্যকলাপ নয়। শাকা প্যাকেজার সমস্ত আউটপুট শোনার জন্য সেট করা যেতে পারে, এমনকি যদি শুধুমাত্র একটি উপসেট FFmpeg দ্বারা বিতরণ করা হয়। এইগুলি উপরে বর্ণিত মেশিনে পরীক্ষা করা প্যাকেজার সেটিংস:

packager \
  in=pipe1,stream=audio,init_segment=livehd-audio-1080.webm,segment_template=livehd-audio-1080-\$Number\$.webm \
  in=pipe1,stream=video,init_segment=livehd-video-1080.webm,template=livehd-video-1080-\$Number\$.webm \
  in=pipe2,stream=audio,init_segment=livehd-audio-720.webm,segment_template=livehd-audio-720-\$Number\$.webm \
  in=pipe2,stream=video,init_segment=livehd-video-720.webm,template=livehd-video-720-\$Number\$.webm \
  in=pipe3,stream=audio,init_segment=livehd-audio-360.webm,segment_template=livehd-audio-360-\$Number\$.webm \
  in=pipe3,stream=video,init_segment=livehd-video-360.webm,template=livehd-video-360-\$Number\$.webm \
  --mpd_output livehd.mpd --dump_stream_info --min_buffer_time=10 --time_shift_buffer_depth=300 \
  --segment_duration=3 --io_block_size 65536