1. 程式人生 > >增加udp緩衝區解決高清視訊碼流丟包的方法

增加udp緩衝區解決高清視訊碼流丟包的方法

    通過RTP傳輸高清h264碼流時,當碼流的解析度為1080P,幀率為 60幀每秒的碼流在網路上傳輸過程中,瞬時的位元速率峰值可能會超過系統預設的udp的緩衝區大小,導致解碼資料不完整,看到花屏的視訊。解決這個問題的方法,需要增加udp緩衝區的大小,設定的方法分為設定系統的整體緩衝區,在程式中設定socket的緩衝區。

    (1)設定linux系統的緩衝區的方法,是在命令列下輸入:

sysctl -w net.core.rmem_max=1024000
sysctl -w net.core.wmem_max=1024000
sysctl -w net.core.wmem_default=1024000
sysctl -w net.core.rmem_default=1024000
sysctl -w net.ipv4.udp_mem="1024000 1024000 1024000"
sysctl -w net.ipv4.udp_rmem_min=1024000
sysctl -w net.ipv4.udp_wmem_min=1024000

    設定後,可以查詢
sysctl -a

    (2)在windows下設定緩衝區的方法,是通過修改登錄檔的方法。

執行 regedit,修改或新增表項

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters\
DefaultReceiveWindow REG_DWORD 十進位制 65535
DefaultSendWindow REG_DWORD  十進位制 65535

    (3)在程式中設定,以c/c++為例:
int sockSrv = socket(AF_INET,SOCK_DGRAM, 0);
int value = 1024000;
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF,(char *)&value, sizeof(value));

無論上述哪種方法,最終在socket使用時,都需要驗證下是否設定成功,驗證方法以c/c++為例:

socklen_t valSize = sizeof(value);
getsockopt(sockSrv, SOL_SOCKET, SO_RCVBUF,(char *)&value, &valSize);
printf("socket size: %d\n",value);