傳送位元速率控制之PacedSender模組

2021-08-02 06:56:35 字數 1891 閱讀 8574

前面文章分析過,通過反饋報文rr和remb,可以得到對端期望的傳送位元速率,傳送端需要根據這個位元速率來動態調節自己的傳送位元速率,傳送位元速率的控制主要有兩個模組,vieencoder模組和pacedsender模組,本文章描述pacedsender模組如何調節傳送位元速率。

先看類圖:

pacedsender類中有packetqueue類的物件,我們可以簡單的理解為乙個佇列,別的執行緒將一張編碼,打包成rtp後,便會將乙個packet插入到packetqueue佇列中,而pacedsender在另乙個執行緒執行process(), 根據設定的位元速率來延時一定的時間,然後從packetqueue佇列中取出packet,再傳送到後面的環節。

插入packet的**為:

void pacedsender::insertpacket(rtppacketsender::priority priority,

uint32_t ssrc,

uint16_t sequence_number,

int64_t capture_time_ms,

size_t bytes,

bool retransmission)

從類圖我們可以看到,pacedsender實現了module介面,在pace執行緒中會迴圈呼叫process函式。實際上位元速率控制就是在裡面進行的。我們先看下pacedsender更新目標位元速率的**:

void pacedsender::updatebitrate(int bitrate_kbps,

int max_bitrate_kbps,

int min_bitrate_kbps)

我們看到,最小位元速率min_bitrate_kbps設定給了padding_budget_,注釋裡還說在process()會把最大位元速率max_bitrate_kbps設定給media_budget_, 那麼padding_budget_和media_budget_是幹嘛用的呢,其實他們就是分別用來控制位元速率的下限和上限的,我想了很久也不知道怎麼描述清楚他們控制的原理,其實還是比較簡單的,我先寫出process()的一些注釋吧:

void pacedsender::process() 

media_budget_->set_target_rate_kbps(target_bitrate_kbps);

int64_t delta_time_ms = std::min(kmaxintervaltimems, elapsed_time_ms); //傳送間隔不能小於30ms

updatebytesperinterval(delta_time_ms); //增加media_budget_和padding_budget_的bytes_remaining_

} while (!packets_->empty()) else

} // todo(holmer): remove the paused_ check when issue 5307 has been fixed.

if (paused_ || !packets_->empty()) //從這裡可以看出,只有packets_為空時,才會有後面的padding_budget_的處理

return;

size_t padding_needed;

if (prober_->isprobing()) else

if (padding_needed > 0)

sendpadding(static_cast

(padding_needed)); //當佇列中已經沒有了packet,為了使位元速率不低於最小位元速率,必須填充一些資料發出去

}

ffmpeg位元速率控制

vbr是動態位元速率。cbr是靜態位元速率。vbr variable bitrate 動態位元率。也就是沒有固定的位元率,壓縮軟體在壓縮時根據音訊資料即時確定使用什麼位元率,這是以質量為前提兼顧檔案大小的方式。vbr也稱為動態位元率編碼,使用這個方式時,你可以選擇從最差音質 最大壓縮比到最好音質 最...

ffmpeg位元速率控制

vbr是動態位元速率。cbr是靜態位元速率。vbr variable bitrate 動態位元率。也就是沒有固定的位元率,壓縮軟體在壓縮時根據音訊資料即時確定使用什麼位元率,這是以質量為前提兼顧檔案大小的方式。vbr也稱為動態位元率編碼,使用這個方式時,你可以選擇從最差音質 最大壓縮比到最好音質 最...

ffmpeg位元速率控制

儲存的資料為h264 pcodecctx bit rate 1800000 通常單位為 位每秒 bit s,b s 也寫作bps。b 應該總是小寫,以避免與 位元組每秒 bytes s,b s 混淆。位元組 byte 是構成資訊的單位,在計算機中作為處理資料的基本單位,1位元組等於8位,即 1 by...