Skip to content

লাইভ এনকোডার সেটিংস

লাইভ এনকোডারের প্রতিটা সেটিং কেন VOD-এর উল্টো — CBR, দুই সেকেন্ডের কীফ্রেম, B-frame, preset, হার্ডওয়্যার এনকোডার, অডিও, আর আপলোড স্পিড থেকে বিটরেট ঠিক করার হিসাব।

গল্পে বুঝি

পহেলা বৈশাখের সকাল, চারুকলা থেকে মঙ্গল শোভাযাত্রা বের হবে। সামনের সারিতে ঢোল বাজাবেন খোয়ারিজমি, আর তার পেছনে কয়েকশো মানুষ সেই তালে পা মেলাবে। অনুশীলনের দিন দলের প্রধান সিনা তাকে একটাই কথা বারবার বলেছেন: “তোমার তাল যেন কখনো না বদলায়। গান জমে উঠলে উৎসাহে জোরে আর দ্রুত বাজিয়ো না, আবার ক্লান্ত হলে ধীরও হয়ো না।”

কারণটা সিনা বুঝিয়ে দিলেন। একা মঞ্চে বাজালে খোয়ারিজমি যেমন খুশি বাজাতে পারেন: শান্ত অংশে আস্তে, জমজমাট অংশে দ্রুত আর জোরে, শ্রোতা বসে শোনে, কারও কোনো অসুবিধা নেই। কিন্তু শোভাযাত্রায় পেছনের মানুষদের পা তার তালে বাঁধা, আর রাস্তাটা সরু, শাহবাগের মোড়ে একসাথে বেশি মানুষ ঢুকতে পারে না। খোয়ারিজমি হঠাৎ দ্রুত বাজালে পেছনের মানুষ ঠেলাঠেলি শুরু করবে, মোড়ে জট লেগে যাবে। আর প্রতি চার কদমে একবার জোরে “ধা” দিতে হবে, প্রতিবার ঠিক একই জায়গায়, যাতে পেছনের ছোট দলগুলো, যারা অন্য রাস্তা দিয়ে এসে মাঝপথে যোগ দেবে, তারা ঠিক সেই “ধা” শুনেই পা মিলিয়ে ঢুকতে পারে। মাঝখানে যেকোনো সময় ঢোকা যায় না, শুধু “ধা”-তে।

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

মিলিয়ে নিই: খোয়ারিজমির স্থির তাল হলো CBR (constant bitrate), আর একা মঞ্চে ইচ্ছামতো বাজানো হলো VOD-এর CRF / VBR। সরু রাস্তা হলো এনকোডারের আপলিংক। প্রতি চার কদমে নির্দিষ্ট জায়গায় “ধা” হলো নির্দিষ্ট keyframe interval, আর শুধু “ধা”-তে মাঝপথে যোগ দেওয়া হলো প্লেয়ারের ABR সুইচ বা নতুন দর্শকের শুরু, যা শুধু keyframe-এ সম্ভব। পরের বোল আগে ভেবে নেওয়া হলো lookahead আর B-frame, যা মান বাড়ায় কিন্তু দেরি যোগ করে, তাই লাইভে কম বা বন্ধ (tune zerolatency)। আর ফারাবির “পুরো রাস্তা ভরো না” হলো আপলোড স্পিডের হেডরুম। বাস্তবে একটা লাইভ এনকোডার ঠিকমতো সেট করা মানে ঠিক এই চারটা সিদ্ধান্ত নেওয়া।

লাইভ এনকোডার কেন আলাদা

ভিডিও ট্র্যাকে কোডেক আর rate control কীভাবে কাজ করে তা আছে। লাইভে একই এনকোডার ব্যবহার হয়, কিন্তু প্রায় প্রতিটা সিদ্ধান্ত উল্টে যায়, কারণ তিনটা বাধ্যবাধকতা:

  1. রিয়েল-টাইম: এনকোডারকে প্রতি সেকেন্ডে এক সেকেন্ডের ভিডিও বানাতেই হবে, প্রতিটা সেকেন্ডে।
  2. সীমিত আপলিংক: এনকোডারের আউটপুট একটা নির্দিষ্ট আপলোড পাইপ দিয়ে যায়, যা হঠাৎ বেশি ডেটা নিতে পারে না।
  3. পরের ধাপের ছন্দ: ট্রান্সকোডার আর প্যাকেজার keyframe ধরে সেগমেন্ট কাটে, তাই keyframe নির্দিষ্ট ছন্দে আসতে হবে।
সেটিংVOD-এ সাধারণতলাইভে সাধারণতকেন
Rate controlCRF বা 2-pass VBRCBR বা কড়া সীমার VBRআপলিংক হঠাৎ বেশি নিতে পারে না
Keyframescene change-এ, লম্বা GOPনির্দিষ্ট, সাধারণত ২ সেকেন্ড পরপরসেগমেন্ট আর ABR সুইচ keyframe-এ
Presetslow, veryslowveryfast, faster বা হার্ডওয়্যাররিয়েল-টাইমের নিচে থাকতে হবে
Lookaheadবড়ছোট বা বন্ধপ্রতিটা lookahead ফ্রেম দেরি যোগ করে
B-frameঅনেককম (০-২)দেরি আর WebRTC সামঞ্জস্য
Pass2-pass1-passপুরো ভিডিও আগে দেখার সুযোগ নেই

Rate control: কেন CBR

VOD-এ CRF প্রায় সবসময় সেরা পছন্দ: আপনি একটা মান ঠিক করেন, এনকোডার যতটা বিটরেট লাগে নেয়। সহজ দৃশ্যে কম, কঠিন দৃশ্যে বেশি। লাইভে ঠিক এই “কঠিন দৃশ্যে বেশি” জিনিসটাই সমস্যা।

এটা নিজে মেপে দেখেছি। একটা ১০ সেকেন্ডের টেস্ট ভিডিও, যার ৪ থেকে ৭ সেকেন্ডে ভারী নয়েজ (ভিড়, বৃষ্টি, পাতার নড়াচড়া, কনফেটি, যেকোনো জটিল দৃশ্যের মতো), একবার CRF দিয়ে আর একবার CBR দিয়ে এনকোড করে প্রতি সেকেন্ডের বিটরেট:

SRC="testsrc2=size=1280x720:rate=30,noise=alls=60:allf=t+u:enable='between(t,4,7)'"

# VOD-style: constant quality
ffmpeg -f lavfi -i "$SRC" -t 10 -c:v libx264 -preset veryfast -crf 23 -f mpegts crf.ts

# Live-style: constant bitrate, fixed 2 s keyframes
ffmpeg -f lavfi -i "$SRC" -t 10 -c:v libx264 -preset veryfast -tune zerolatency \
  -b:v 3000k -maxrate 3000k -bufsize 3000k \
  -g 60 -keyint_min 60 -sc_threshold 0 -x264-params nal-hrd=cbr \
  -f mpegts cbr.ts
second:   0     1     2     3     4      5      6      7     8
CRF 23:  2.5M  2.7M  2.9M  2.9M  62.5M  67.2M  67.4M  9.4M  2.6M
CBR 3M:  3.2M  3.1M  3.2M  3.1M  4.2M   2.9M   3.0M   1.5M  2.6M

(আসল আউটপুট, ffprobe দিয়ে প্যাকেটের আকার যোগ করে।) কঠিন দৃশ্যে CRF তিন মেগাবিট থেকে লাফিয়ে ৬৭ মেগাবিট প্রতি সেকেন্ডে উঠেছে, বাইশ গুণ। VOD ফাইলে এটা কোনো সমস্যা নয়। কিন্তু যদি আপনার আপলোড স্পিড ১০ Mbps হয়, তাহলে লাইভে ওই তিন সেকেন্ডের ডেটা পাঠাতে প্রায় বিশ সেকেন্ড লাগবে, আর স্ট্রিম ততক্ষণে ভেঙে পড়েছে। CBR একই দৃশ্যে ৩ Mbps-এর কাছেই থেকেছে; মান সাময়িকভাবে খারাপ হয়েছে (নয়েজ ঝাপসা), কিন্তু স্ট্রিম চলেছে।

এটাই লাইভের ট্রেড-অফ: জটিল দৃশ্যে মান কমবে, কিন্তু বিটরেট নয়। দর্শক কয়েক সেকেন্ড ঝাপসা মেনে নেয়, থেমে যাওয়া মেনে নেয় না।

তিনটা প্যারামিটার একসাথে কাজ করে:

  • -b:v: গড় লক্ষ্য বিটরেট।
  • -maxrate: সর্বোচ্চ সীমা। CBR-এ -b:v-এর সমান।
  • -bufsize: কতটা সময় জুড়ে গড় মাপা হবে (VBV বাফার)। -b:v-এর সমান মানে “যেকোনো এক সেকেন্ডে সীমা ছাড়াবে না”; বড় দিলে এনকোডার ছোট সময়ের জন্য বেশি নিতে পারে। লাইভে ১ থেকে ২ সেকেন্ডের সমান রাখা প্রচলিত।

“Constrained VBR” মানে -maxrate আর -bufsize দিয়ে সীমা বাঁধা VBR বা CRF। এটা সহজ দৃশ্যে কম বিটরেট নেয় (ব্যান্ডউইথ বাঁচায়) আর কঠিন দৃশ্যে সীমায় থামে। অনেক প্ল্যাটফর্ম কড়া CBR চায় (YouTube-এর লাইভ এনকোডার পেজ CBR লেখে), কারণ ইনজেস্ট আর ট্রান্সকোডারের দিকে স্থির বিটরেট সামলানো সহজ। নিজের প্ল্যাটফর্মে constrained VBR গ্রহণ করতে পারেন, তবে সেটা আপলিংকের সীমার নিচে বেঁধে রাখুন।

Keyframe interval

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

  • প্যাকেজার keyframe-এ সেগমেন্ট কাটে। ২ সেকেন্ডের সেগমেন্ট চাইলে কমপক্ষে প্রতি ২ সেকেন্ডে একটা keyframe লাগবে।
  • নতুন দর্শক শুধু keyframe থেকে শুরু করতে পারে। keyframe ১০ সেকেন্ড পরপর হলে কেউ ঢুকলে প্রথম ছবি দেখতে গড়ে কয়েক সেকেন্ড অপেক্ষা।

প্রচলিত মান ২ সেকেন্ড। YouTube-এর লাইভ এনকোডার পেজও ২ সেকেন্ড সুপারিশ করে আর ৪ সেকেন্ডের বেশি না রাখতে বলে (২০২৬ সালের অক্টোবর অনুযায়ী)। ffmpeg-এ এটা ফ্রেমে দিতে হয়: ৩০ fps-এ ২ সেকেন্ড মানে -g 60।

-g 60              keyframe at most every 60 frames
-keyint_min 60     and no sooner
-sc_threshold 0    never insert an extra keyframe on scene change

শেষেরটা গুরুত্বপূর্ণ। x264 নিজে থেকে দৃশ্য বদলালে একটা বাড়তি keyframe বসায় (scenecut)। VOD-এ এটা ভালো, লাইভে এটা ছন্দ ভাঙে: সেগমেন্টগুলো অসমান হয়, আর রেন্ডিশনগুলোর keyframe আর মেলে না। উপরের পরীক্ষায় keyframe কোথায় পড়েছে:

CRF (default x264): keyframes at 0.1 s, 7.1 s          ← scene change, irregular
CBR (-g 60, sc 0):  keyframes at 0.0, 2.0, 4.0, 6.0, 8.0 ← every 2 s exactly

নিজের স্ট্রিম যাচাই করতে:

ffprobe -v error -select_streams v -show_entries packet=pts_time,flags -of csv=p=0 input.ts \
  | awk -F, '$2 ~ /K/ {print $1}'

OBS-এ এটা সেকেন্ডে দেওয়া হয়: Settings → Output → Streaming → Keyframe Interval: 2 s। ডিফল্ট 0 মানে “এনকোডার নিজে ঠিক করবে”, যা প্রায়ই অনেক লম্বা হয়; এটা অবশ্যই বদলান।

Closed GOP রাখুন। Open GOP-এ একটা keyframe-এর পরের B-frame আগের GOP-এর ফ্রেম থেকে prediction করতে পারে; সেগমেন্টের সীমায় কেটে ফেললে নতুন সেগমেন্ট থেকে শুরু করা প্লেয়ার সেই ফ্রেম ডিকোড করতে পারে না। x264-এর ডিফল্ট closed GOP, কিন্তু কিছু হার্ডওয়্যার এনকোডারে open GOP ডিফল্ট থাকে; এনকোডারের সেটিং একবার দেখে নিন।

B-frame, lookahead আর tune zerolatency

B-frame আগের আর পরের ফ্রেম দুটো থেকেই prediction করে, তাই এনকোডারকে পরের ফ্রেম পর্যন্ত অপেক্ষা করতে হয়, আর ডিকোডারকে ফ্রেমগুলো ক্রম বদলে পেতে হয়। প্রতিটা B-frame মোটামুটি এক ফ্রেম দেরি যোগ করে। ২০-৩০ সেকেন্ডের HLS-এ এটা নগণ্য; সাব-সেকেন্ড WebRTC-তে এটা বড়, আর অনেক WebRTC ইমপ্লিমেন্টেশন B-frame গ্রহণই করে না।

Lookahead এনকোডারকে সামনের কয়েক ডজন ফ্রেম দেখে বিটরেট বণ্টন করতে দেয়। x264-এর ডিফল্ট rc-lookahead কয়েক ডজন ফ্রেম, যা ৩০ fps-এ এক সেকেন্ডের বেশি দেরি।

x264-এর -tune zerolatency একসাথে এগুলো বন্ধ বা ছোট করে: B-frame বন্ধ, lookahead বন্ধ, mbtree বন্ধ, আর sliced threads চালু (একটা ফ্রেম অনেক থ্রেডে ভাগ করে এনকোড, ফ্রেম জমিয়ে নয়)। দাম হলো একই বিটরেটে মান কিছুটা কম।

কোনটা কখন:

  • স্ট্যান্ডার্ড HLS (১৫ সেকেন্ডের বেশি): zerolatency লাগবে না। ২টা B-frame রাখুন; YouTube-এর পেজও ২টা B-frame লেখে। মান ভালো হবে।
  • লো লেটেন্সি (২-৫ সেকেন্ড): B-frame ০ থেকে ২, lookahead ছোট।
  • WebRTC / WHIP: zerolatency, B-frame ০।

Preset ও হার্ডওয়্যার এনকোডার

x264-এর preset এনকোডারকে বলে প্রতি ফ্রেমে কতটা খাটবে। ধীর preset মানে একই বিটরেটে ভালো মান, কিন্তু বেশি CPU। লাইভে শর্ত একটাই: এনকোডিং গতি ১x-এর উপরে, যথেষ্ট হেডরুম সহ, যাতে ক্যামেরার একটা জটিল মুহূর্তে বা ব্যাকগ্রাউন্ডে অন্য কিছু চললে পিছিয়ে না পড়ে।

একটা Apple M-সিরিজ ল্যাপটপে ১০৮০p৩০, ৬ Mbps, শুধু এনকোডিংয়ের গতি (আসল মাপ, -f null দিয়ে; আপনার মেশিনে আলাদা হবে):

libx264 -preset veryfast     speed=15.3x
libx264 -preset slow         speed=4.03x
h264_videotoolbox            speed=6.21x

একটা স্ট্রিমের জন্য তিনটাই যথেষ্ট দ্রুত। কিন্তু OBS একই সময়ে সিন কম্পোজ করছে, ক্যামেরা ডিকোড করছে, হয়তো একটা গেম চলছে; আর একটা পুরনো ল্যাপটপে slow সহজেই ১x-এর নিচে নামে। নিয়ম: যে preset-এ CPU ব্যবহার মোটামুটি অর্ধেকের নিচে থাকে, সেটা নিন।

হার্ডওয়্যার এনকোডার CPU-কে মুক্ত রাখে:

এনকোডারকোথায়ffmpeg-এOBS-এ
NVENCNVIDIA GPUh264_nvenc, hevc_nvenc, av1_nvencNVIDIA NVENC H.264 / HEVC / AV1
Quick Sync (QSV)Intel CPU-র ভেতরের GPUh264_qsv, hevc_qsvQuickSync H.264
AMFAMD GPUh264_amfAMD HW H.264
VideoToolboxmacOS (Apple Silicon/Intel)h264_videotoolbox, hevc_videotoolboxApple VT H264 Hardware Encoder

নতুন প্রজন্মের হার্ডওয়্যার এনকোডার (বিশেষত সাম্প্রতিক NVENC) অনেক ক্ষেত্রে x264 veryfast-এর কাছাকাছি বা ভালো মান দেয়, কোনো CPU খরচ ছাড়া। কোন জেনারেশন কতটা ভালো, সেটা দ্রুত বদলায়; নিজের কনটেন্টে পাশাপাশি এনকোড করে চোখে বা VMAF দিয়ে তুলনা করুন (কোয়ালিটি চ্যাপ্টার)।

রেজোলিউশন, ফ্রেম রেট ও অডিও

রেজোলিউশন বিটরেটের সাথে মিলিয়ে। কম বিটরেটে বেশি রেজোলিউশন দিলে প্রতিটা পিক্সেলের জন্য কম বিট থাকে, ছবি ব্লকি হয়। ৩ Mbps-এ ১০৮০p৩০-এর চেয়ে ৭২০p৩০ সাধারণত পরিষ্কার দেখায়।

ফ্রেম রেট বিষয় অনুযায়ী। ওয়াজ, আলোচনা, ক্লাসে ৩০ fps যথেষ্ট; খেলা আর গেমে ৬০ fps মসৃণ, কিন্তু একই রেজোলিউশনে উল্লেখযোগ্য বেশি বিটরেট লাগে। বাংলাদেশে বিদ্যুতের ফ্রিকোয়েন্সি ৫০ Hz, তাই ঘরের ভেতরে টিউবলাইট বা LED-এর নিচে ৩০ বা ৬০ fps-এ কখনো আলো ঝিকমিক (flicker) করে; ক্যামেরায় শাটার ১/৫০ বা ১/১০০ করলে বা ২৫/৫০ fps-এ গেলে কমে।

অডিও কখনো অবহেলা করবেন না। দর্শক খারাপ ছবি অনেকক্ষণ সহ্য করে, খারাপ শব্দ কয়েক সেকেন্ডও না। প্রচলিত সেটিং AAC-LC, স্টেরিও, ১২৮ থেকে ১৬০ kbps। YouTube-এর পেজ স্টেরিওর জন্য ৪৪.১ kHz আর ১২৮ kbps লেখে; অনেক প্ল্যাটফর্ম ও ভিডিও পাইপলাইন ৪৮ kHz ব্যবহার করে। যেটাই নিন, পুরো চেইনে একই রাখুন, নাহলে মাঝপথে রিস্যাম্পলিং হয় আর কখনো ধীরে ধীরে অডিও-ভিডিও সিঙ্ক সরে যায়। WebRTC/WHIP হলে অডিও Opus।

প্ল্যাটফর্মের সুপারিশ

YouTube-এর লাইভ এনকোডার পেজের H.264 টেবিল থেকে কয়েকটা সারি (২০২৬ সালের অক্টোবর অনুযায়ী; পেজটা নিয়মিত বদলায়, স্ট্রিম করার আগে সেখানে মিলিয়ে নিন):

ইনজেস্টসর্বনিম্নসুপারিশকৃত
১০৮০p, ৬০ fps৬ Mbps১৭ Mbps
১০৮০p, ৩০ fps৫ Mbps১৪ Mbps
৭২০p, ৬০ fps৩ Mbps৮ Mbps
৭২০p, ৩০ fps৩ Mbps৮ Mbps
৪৮০p, ৩০ fps০.৪ Mbps৪ Mbps

একই পেজ CBR, ২ সেকেন্ডের keyframe, ২টা B-frame আর Rec. 709 রঙ লেখে। Twitch-এর নিজস্ব সীমা আর সুপারিশ আছে, যা Twitch-এর হেল্প সেন্টারের “Broadcasting Guidelines” পেজে দেখুন; সেটা এই লেখার সময় যাচাই করা যায়নি, তাই এখানে সংখ্যা দেওয়া হলো না। নিজের প্ল্যাটফর্মে আপনার ট্রান্সকোডার যতটা বিটরেট থেকে ভালো ল্যাডার বানাতে পারে, সেটাই আসল সীমা।

আপলোড স্পিড থেকে বিটরেট

সব কিছুর উপরে আসল সীমা হলো এনকোডারের আপলোড স্পিড। একটা প্রচলিত রুল অফ থাম্ব: মোট বিটরেট (ভিডিও আর অডিও মিলে) মাপা আপলোড স্পিডের মোটামুটি ৭০ ভাগের বেশি নয়। বাকিটা হেডরুম, কারণ আপলোড স্পিড স্থির থাকে না, আর একই লাইনে অন্য কেউ কিছু আপলোড করলে, বা কেউ ভিডিও কল করলে, সেটা মুহূর্তেই কমে।

একটা উদাহরণ (হিসাবটা ব্যাখ্যার জন্য):

measured upload (median of several tests)   8.0 Mbps
× 0.7 headroom                              5.6 Mbps budget
− audio 160 kbps                            5.4 Mbps for video
→ 720p30 at about 4.5 to 5 Mbps is comfortable; 1080p30 at 5.4 Mbps is borderline

বাংলাদেশে এই হিসাব বিশেষ জরুরি, কয়েকটা বাস্তব কারণে:

  • অনেক ব্রডব্যান্ড প্যাকেজে আপলোড আর ডাউনলোড আলাদা হতে পারে। প্যাকেজের “৫০ Mbps” দেখে আপলোড ধরবেন না; নিজে মাপুন।
  • সন্ধ্যার পিক আওয়ারে স্পিড কমে। স্পিড টেস্ট দুপুরে করে রাতের ওয়াজ লাইভ করলে হিসাব মিলবে না; যে সময়ে লাইভ হবে, সেই সময়ে কয়েক দিন মাপুন।
  • মোবাইল হটস্পটে আপলোড কয়েক সেকেন্ডের মধ্যে অনেক ওঠানামা করে, আর ভিড়ের জায়গায় (মাহফিল, খেলার মাঠ, মেলা) টাওয়ার ভরে গেলে প্রায় শূন্যে নামতে পারে। সেখানে বিটরেট কম রাখুন, SRT ব্যবহার করুন (আগের চ্যাপ্টার), আর সম্ভব হলে দুটো আলাদা অপারেটরের সংযোগ রাখুন (চ্যাপ্টার ৯)।
  • Wi-Fi নয়, তার। একই রাউটারে ল্যাপটপ তার দিয়ে লাগালে আপলোড অনেক বেশি স্থির হয়।

আপলোড স্পিড মাপতে ব্রাউজারের স্পিড টেস্ট যথেষ্ট, কিন্তু যে সার্ভারে ইনজেস্ট করবেন তার কাছাকাছি একটা সার্ভার বেছে নিন। নিজের VPS থাকলে iperf3 দিয়ে সরাসরি সেখানে মাপুন:

# On the ingest VPS
iperf3 -s

# On the encoder machine: send for 30 s, report each second
iperf3 -c ingest.baytalhikma.org -t 30 -i 1

গড় নয়, সবচেয়ে খারাপ কয়েক সেকেন্ড দেখুন; লাইভ ভাঙে সেখানেই।

OBS-এর stats প্যানেল পড়া

OBS-এর View → Stats (বা Docks → Stats) লাইভ চলাকালীন এনকোডারের সবচেয়ে সৎ রিপোর্ট। তিন ধরনের ড্রপ আলাদা করে দেখায়, আর প্রতিটার কারণ আলাদা:

কাউন্টারমানেসমাধান
Frames missed due to rendering lagGPU সিন সময়মতো বানাতে পারছে নাসিনে সোর্স কমান, ব্রাউজার সোর্স বা ফিল্টার কমান, গেমের FPS সীমা দিন
Skipped frames due to encoding lagএনকোডার রিয়েল-টাইমের সাথে তাল রাখতে পারছে নাদ্রুত preset, হার্ডওয়্যার এনকোডার, কম রেজোলিউশন বা FPS
Dropped frames (network)আপলিংক বিটরেট নিতে পারছে নাবিটরেট কমান, তার লাগান, SRT-এ যান

একটা উদাহরণ যেখানে সমস্যা স্পষ্টভাবে নেটওয়ার্কে (মানগুলো ব্যাখ্যার জন্য):

CPU usage                          22%
Missed frames (rendering lag)      0 / 54210 (0.0%)
Skipped frames (encoding lag)      0 / 54210 (0.0%)
Dropped frames (network)           1842 / 54210 (3.4%)
Total data output                  1.21 GB
Bitrate                            3820 kb/s  (target 6000)

বিটরেট লক্ষ্যের অনেক নিচে আর নেটওয়ার্ক ড্রপ ৩ ভাগের বেশি: আপলিংক ৬ Mbps নিতে পারছে না। এনকোডার বা GPU-র কোনো দোষ নেই।

OBS-এর Settings → Advanced → Network-এ “Dynamically change bitrate to manage congestion” অপশন থাকলে চালু করে দেখুন। এটা নেটওয়ার্ক খারাপ হলে বিটরেট সাময়িক কমায়, ফ্রেম ফেলার বদলে। এটা কোন ভার্সন ও কোন আউটপুটে কাজ করে, OBS-এর ডকসে দেখে নিন।

একটা ভালো শুরুর সেটিং

৭২০p৩০, স্থির ব্রডব্যান্ড, স্ট্যান্ডার্ড বা লো লেটেন্সি HLS-এর জন্য ffmpeg-এ:

ffmpeg -re -i input \
  -c:v libx264 -preset veryfast -profile:v high \
  -b:v 3500k -maxrate 3500k -bufsize 3500k -x264-params nal-hrd=cbr \
  -g 60 -keyint_min 60 -sc_threshold 0 -bf 2 \
  -pix_fmt yuv420p \
  -c:a aac -b:a 128k -ar 48000 -ac 2 \
  -f flv "rtmps://ingest.baytalhikma.org/live/sk_7f3a9c2e"

WebRTC বা সাব-সেকেন্ড হলে -tune zerolatency -bf 0 যোগ করুন আর অডিও -c:a libopus করুন। OBS-এ একই জিনিস: Rate Control CBR, Bitrate 3500, Keyframe Interval 2 s, Preset veryfast (বা হার্ডওয়্যার এনকোডার), Profile high, Audio Bitrate 128 বা 160।

ডিবাগিং: এই চ্যাপ্টারের সমস্যাগুলো

লক্ষণনিশ্চিত হবেন কীভাবেসমাধান
জটিল দৃশ্যে স্ট্রিম আটকায়, সহজ দৃশ্যে ঠিকএনকোডারের আউটপুট রেকর্ড করে প্রতি সেকেন্ডের বিটরেট দেখুন (উপরের ffprobe পদ্ধতি); লাফ দিলে rate control CRF বা খোলা VBRCBR বা -maxrate/-bufsize দিয়ে বাঁধা VBR
প্লেয়ার কোয়ালিটি বদলালে ছবি ভাঙে বা লাফায়প্রতিটা রেন্ডিশনের keyframe সময় ffprobe দিয়ে মেলান-g নির্দিষ্ট, -sc_threshold 0, closed GOP
সেগমেন্টগুলো অসমান দৈর্ঘ্যের, কোনোটা ৭ সেকেন্ডপ্লেলিস্টে EXTINF দেখুন; keyframe interval সেগমেন্টের চেয়ে লম্বা বা অনিয়মিতkeyframe interval সেগমেন্ট দৈর্ঘ্যের সমান বা তার ভাগ করুন; OBS-এ 0 নয়, 2
নতুন দর্শক শুরু করতে অনেকক্ষণ কালো স্ক্রিনkeyframe কত সেকেন্ড পরপর২ সেকেন্ডে আনুন
OBS-এ “encoding lag”Stats প্যানেলদ্রুত preset, হার্ডওয়্যার এনকোডার, কম রেজোলিউশন
OBS-এ “rendering lag”Stats প্যানেল; GPU ব্যবহারসিন সহজ করুন, গেমের FPS সীমা দিন
OBS-এ “dropped frames (network)”Stats-এ বিটরেট লক্ষ্যের নিচে; iperf3 দিয়ে আপলোড মাপুনবিটরেট আপলোডের ৭০ ভাগের নিচে আনুন, তার লাগান
WebRTC-তে ছবি আসে না বা ঝাঁকুনিএনকোডারে B-frame আছে কিনা (ffprobe -show_frames দিয়ে pict_type=B)-bf 0, -tune zerolatency
ঘরের ভেতরের লাইভে আলো ঝিকমিক করেশুধু কৃত্রিম আলোর নিচে হয়, বাইরে হয় নাক্যামেরার শাটার ১/৫০ বা ১/১০০, বা ২৫/৫০ fps
অডিও ধীরে ধীরে ভিডিও থেকে সরে যায়স্ট্রিম চালু রেখে এক ঘণ্টা পর ঠোঁট মেলান; চেইনে কোথাও sample rate বদলাচ্ছে কিনাপুরো চেইনে একই sample rate; ক্যামেরা আর অডিও ইন্টারফেস একই ক্লক

মূল শিক্ষা

  1. লাইভে CBR বা কড়া সীমার VBR, কারণ আপলিংক হঠাৎ বেশি ডেটা নিতে পারে না। CRF একটা জটিল দৃশ্যে বিটরেট বাইশ গুণ বাড়াতে পারে, যা আমাদের পরীক্ষায় দেখা গেছে।
  2. Keyframe নির্দিষ্ট ছন্দে, সাধারণত ২ সেকেন্ড পরপর, scene-change keyframe বন্ধ, closed GOP। OBS-এ ডিফল্ট 0 বদলাতেই হবে।
  3. B-frame আর lookahead মান বাড়ায় কিন্তু দেরি যোগ করে। স্ট্যান্ডার্ড HLS-এ রাখুন, সাব-সেকেন্ডে বন্ধ করুন।
  4. Preset এমন নিন যাতে এনকোডিং গতিতে যথেষ্ট হেডরুম থাকে; হার্ডওয়্যার এনকোডার CPU মুক্ত রাখে।
  5. মোট বিটরেট মাপা আপলোডের মোটামুটি ৭০ ভাগের নিচে, আর মাপুন যে সময়ে লাইভ হবে সেই সময়ে, সবচেয়ে খারাপ সেকেন্ডগুলো দেখে।
  6. OBS stats তিন ধরনের ড্রপ আলাদা করে দেখায়: rendering, encoding, network। প্রতিটার সমাধান আলাদা, তাই আগে কোনটা সেটা দেখুন।
  7. প্ল্যাটফর্মের সুপারিশ বদলায়। স্ট্রিমের আগে তাদের নিজস্ব হেল্প পেজে মিলিয়ে নিন।