- 博客(114)
- 资源 (1)
- 收藏
- 关注
原创 H264编码步骤
1 预测编码:帧内预测,对一帧视频进行编码,I帧。帧间预测,几帧视频进行编码,P帧、B帧。这部分有运动估计,优化的难点。2 变换编码(即DCT编码,离散余弦编码)和量化编码DCT编码:把低频信息(对应大面积的平坦区域)转化到左上角,高频信息(人眼不敏感的信息)转化到右下角。量化编码:比如240,qp=28,240/28=9。再进行之字型扫描。3 熵编码:经常出现的短码表示,偶尔出现的长码表示。一般是cabac方式。原始值-预测值=差值,对差值编码。...
2022-07-06 18:42:17
511
原创 QUIC特性
PS,图都是这个文章的,。疑问:PC端、Android、IOS程序,不是浏览器,用quic传输音视频,加密、解密不耗时吗?效果好在那?当然大厂都上QUIC了。quic建立在udp上,用TLS1.3加密解密,自己实现了拥塞控制,不用修改系统内核。多路复用是HTTP/2的主要特性。
2022-05-19 18:11:19
548
原创 通过抓包看quic定义的包结构
RFC9000有完整的标准。由Header Packet+Frame组成。一 Header Packet分Long Header Packet、Short Header Packet。重要是DCID和SCID,服务器和客户端的标识。长度--2字节,Packet Number--1字节--变长。Long Header Packet包括以下4种,Packet Type如下:Short Header Packet包括1-RTT。二 Frame Type帧类型..
2022-05-19 17:34:07
1452
原创 quic使用--ngtcp2编译和demo使用
quic是在udp上,用了TSL1.3,加密了(加密解密,不会影响视频观看吗?)。重传,可以通过seq,区分重传还是原视的,解决了歧义二次性。
2022-05-19 16:58:24
1943
原创 WebRTC的source、sink、track关系
Source代表源,比如摄像头、桌面,sink是消费。一个source可以对应多个sink。比如摄像头需要显示,编码。一个track包括了Source和sink。VideoSourceInterface有AddOrUpdateSink,建立了source和sink的关系,类似filter的连接。VideoSinkInterface有OnFrame,视频就回调到这个函数。红色方框是peerconnection_client用到的类。...
2022-05-07 14:24:28
852
原创 WebRTC的RTCStats
一 peerconnection_client.exe新增RTCStats功能1 class RtcStatsObserver : public virtual webrtc::RTCStatsCollectorCallback{public: virtual void OnStatsDelivered(const rtc::scoped_refptr<const webrtc::RTCStatsReport>& report); //信息回调到这个函数};2 rt
2022-04-24 17:46:46
726
原创 WebRTC的DataChannel功能
一 DataChannel可以发送聊天的文本信息,可以走RTP和DTLS。新版本用RTP不行,sdp协商时,RtpDataChannel的state_变成kClose。sdp新增了application字段,协议走UDP/DTLS/SCTP。m=application 9 UDP/DTLS/SCTP webrtc-datachannelc=IN IP4 0.0.0.0a=ice-ufrag:qZdIa=ice-pwd:l2lrs5FGHFlox6XZ6rIiKSdTa=ice-opti
2022-04-22 19:17:03
1519
原创 WebRTC音频知识
一 采集间隔是10ms,windows平台的采样频率默认是16000。播放频率是48000,也判断支不支持,双通道。RTP打包间隔是20ms,所以时间戳以960递增。一秒发50个包,48000/50=960。opus编码器是48000,编码前经过了重采样。二 opus编码器设置:config.dtx_enabled=false,config.complexity=9,config.cbr_enabled=false,voip即语音主要使用SILK编码,音乐是CELT。三
2022-04-21 17:44:11
873
原创 WebRTC的Jitter计算
WebRtcVoiceMediaChannel::GetStats--| AudioReceiveStream::GetStats --| ChannelReceive::GetRTCPStatistics() --| StreamStatisticianImpl::GetStats() stats.jitter = jitter_q4_ >> 4;StreamStatisticianImpl::UpdateJitter{if (time_dif.
2022-04-19 19:33:02
675
原创 WebRTC Audio NetEQ学习笔记
DelayManager有一个直方图Histogram,统计延迟信息(具体怎么算的没懂),获得延时的值。即TargetDelayMs(),target_level_ms_。double quantile = 0.97;double forget_factor = 0.9993;1DelayManager:计算接收音频包的延时。最大个数max_packets_in_buffer_ = 200。DelayManager::Update{...UpdateDelayHistory(i.
2022-04-16 18:07:25
607
原创 简述音频3A算法概念
回声:远端的扬声器声音被麦克风采集到,然后传输给你,你听到自己的声音。先AEC,再NS,最后AGC。一 AEC:acoustic echo cancellation,回声消除。经过三个步骤:1 远端和近端的延时预估,即麦克风和扬声器的延时。(声音的采集线程和播放线程启动时间不同。)2 自适应线性滤波器:把麦克风的线性回声减去--从扬声器中获得的。用NLMS(normalized least mean square)。参数:滤波器长度,步长因子。3 非线性滤波:把残留的底噪回声
2022-04-15 18:24:43
5601
原创 PeerConnection_Client信令交互
接收STUN包,bind success request,带ip:port。这就是Candidate。WebRTC的p2p文件夹就是NAT实现,没用第三方开源库。Client主动发送STUN request包,从。
2022-03-26 20:38:29
729
原创 WebRTC的RTT计算及作用
rtcp::Rrtr在rrtr.cc。1 VCMNackFecMethod::ProtectionFactor(...),根据rtt,丢包率,判断是用nack还是fec。RTCP SR、RR包的发送间隔大概是1秒1个,间隔不能改成很大,影响RTT更新。如果在发送端计算,RTT = 接收RR包时间-发送SR包时间-DLSR(接收端发送RR包-接收SR包时间)将64位的NTP时间,整数取低16位,分数取高16位,变成了32位,即4字节。即T-rr - T-sr -(T1-rr - T1-sr)。
2022-03-23 16:27:13
1525
3
原创 简述WebRTC的UlpFEC实现
1 启用UlpFEC因为WebRTC不让UlpFEC不能和nack同时用,只能将nack去掉。AddDefaultFeedbackParams(VideoCodec* codec,中,把下面两行注掉。//codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamNack, kParamValueEmpty)); //codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamNack, kRtc...
2022-03-17 19:10:08
612
1
原创 简述WebRTC的FlexFEC实现
一帧视频可以分成几个media包,(num_media_packets * protection_factor + (1 > 8,算出fec包个数。7个media包,4个fec包,是kMaskBursty7_4。0x38二进制是0x0011 1000,从左边数,从第一个包开始,第一个fec包是第3、4、5包异或。k=1,表示后面还有mask,即FEC包,k=0表示最后一个。抓包可以看到:H264 media包,Flexfec包,不同ssrc发送的。1个fec包恢复1个丢包。
2022-03-09 18:47:09
2612
原创 简述WebRTC中的丢包重传Nack的实现
RTCP FB Nack包如上图所示:pt=205,fmt=1,PID是丢包的起始序列号-2字节,BLP表示起始序列号后面16位丢包情况,1是丢包,0是没丢包。这是WebRTC中的SDP,原视频流PT是96,重传RTX PT是97, ssrc-group是原视频流ssrc和RTX ssrc。sender ssrc是发送RTCP NACK包这端发送视频rtp包的ssrc,media ssrc是随机生成的。接收端发现序列号不连续,发送RTCP FB Nack包,发送端从历史队列中查找该包,再发送RTP包,
2022-03-04 21:00:55
1015
原创 简述WebRTC的音视频同步
参考WebRTC 音视频同步原理与实现 - 知乎下图是上文中的。音视频的RTP的时间戳,加了一个随机的偏移量,且两者不等。通过RTCP的SR包的NTP、RTP时间戳,计算出音视频的RTP时间戳偏移量,即图中的offset。offset随着收到的SR包一直在更新。按我理解,offset是rtp时间戳的偏移,不是ntp的时间差。RtpStreamsSynchronizer::Process() { ... int relative_delay_ms; // Calcula.
2022-02-26 19:12:57
594
原创 抓包分析下微信视频会议--用上Quic
音视频传输用上了quic,音视频都是一个端口发送的。另一个IP向本地发RTCP包,用了webrtc的transport-cc。本地向那个ip回了udp消息,二进制的。只看得出来这些,网上没有分析的文章。...
2022-02-10 17:19:34
2806
原创 用OpenFEC实现RSFEC
FEC原理可以参考这篇文章:谈谈网络通信中的 FEC 基础 - 知乎主要讲讲怎么实现的。OpenFEC支持4种FEC,我用的是OF_CODEC_REED_SOLOMON_GF_2_8_STABLE。编码:假设5个media包(视频数据,一个H264帧分成5个RTP包),2个fec包。1 调用of_rs_new,生成7行5列的编码矩阵。前5行是单位矩阵。如下:(54*M1) ^(74*M2) ^(e7*M3)^(d8*M4) ^(1e*M5) = R1。R2一样的。用o...
2021-10-21 18:21:54
1814
原创 webrtc h264 nack和ulpfec不能同时使用
(video_send_stream.cc:1105): Transmitting payload type without picture ID using NACK+ULPFEC is a waste of bandwidth since ULPFEC packets also have to be retransmitted. Disabling ULPFEC.webrtc源代码中,H264,NACK和FEC不能共存,实际商用中如何处理的?...
2021-09-26 15:23:30
675
1
原创 在线教育音视频SDK mute逻辑
最近在弄音视频SDK,不知道这个逻辑合不合理?mute本地音频:发送的时候,判断mute变量,如果为true,不发送了。 给
2021-06-10 17:44:04
139
原创 D3D Surface/Texture SDL DDraw渲染视频的区别和疑问
1 D3D Surface用起来比较简单,窗口改变时视频模糊,貌似是初始化窗口过小。全屏时有锯齿。 StretchRect的Rect是显示区域宽高,这个值固定是初始值。改成随窗口变化,失败。2 D3D Texture用起来复杂些。跟显示区域宽高无关。 问题:1窗口改变时视频模糊 2全屏时有锯齿。3 SDL开源,效果也不好。4 DDraw比较老了,但效果最好,...
2018-11-12 16:28:36
2193
1
原创 ffmpeg和librtmp推流rtmp的区别和存在的问题
1 ffmpeg可以从rtsp流地址中取H264,推流。 人物运动的时候有局部花屏。2 librtmp推流,时间戳是40。 有灰屏的原因--把nal type = 6的也推上去了。nginx rtmp做流媒体服务器。 ...
2018-09-21 10:34:12
3103
原创 jrtplib时间戳赋值
只能在mark为true时,赋值3600,其它时间赋为0,这样才能一帧中最后一包打mark位。好奇怪啊,貌似延时了一包。用过这个有遇到这样情况吗?
2018-09-21 10:27:39
634
原创 exosip5.0 支持TCP通信
1 eXosip_listen_addr(m_pExcontext, IPPROTO_TCP, NULL, m_SelfInfo.nPlatformPort, AF_INET, 0);2 TCP服务器,eXosip_listen_addr端口填5060,默认支持5060,这样就可以进行TCP通信了。...
2018-09-18 19:36:18
2453
6
原创 jrtplib3.11.1 TCP发送和接收视频流
参照tcptest.cppTCP客户端: int nClient = socket(AF_INET, SOCK_STREAM, 0); sockaddr_in serverAddr; memset(&serverAddr, 0, sizeof(sockaddr_in)); serverAddr.si...
2018-09-17 20:00:00
4502
原创 exosip库 应答info消息返回-6,事务不存在
int nRet = eXosip_message_build_answer(pExcontext, pEvent->tid, 200, &pAnswer);nRet = eXosip_message_send_answer(pExcontext, pEvent->tid, 200, pAnswer);应答INFO消息,返回-6,事务不存在。这是exosip库bug...
2018-09-11 15:48:30
1364
7
原创 PJSIP的配置文件和字段
工程属性,调试->命令参数填入"--config-file=xxx.txt"是完整路径。一 有自动记录音频文件的功能,但没有保存视频文件功能。--rec-file=F:\pjproject-2.4.5\pjproject-2.4.5\pjsip-apps\bin\record.wav--auto-rec二 自动播放——测试但没听见音频文件的声音--play-
2016-05-21 21:14:43
2011
原创 PJSIP增加保存AVI文件功能
PJSIP库没有保存视频文件的功能。保存为AVI文件是因为图像是RGB格式的,有一个avilib类可以写AVI文件。PJSIP库中的ffmpeg解码后,格式是I420,即YUV420P。宽高是720*480。利用ffmpeg的sws_scale可将YUV转为RGB格式。注意格式是PIX_FMT_BGR24,否则颜色不对,红蓝反了。图像是颠倒的,需要进行转换。具体代码如下:使用前
2016-05-21 21:07:56
949
原创 使用pjsua-i386-Win32-vc8-Debug.exe测试,可以看到视频
要在两台电脑上测试,运行exe。台1:vid enablevid acc autorx onvidacc autotx onmsip:10.168.24.179台2:vid enablevid acc autorx onvidacc autotx ona200如果台2看不到视频:vid win show 0,0是窗口编号,
2016-04-17 21:27:54
1762
原创 调试simple_pjsua.c,注册SIP服务器
pjsip-apps\src\samples\simple_pjsua.c功能:注册,拨打和接听。一 新建项目,使用PJSIP库通过链接器——>附加库目录包括lib文件不起作用,必须使用#pragmacomment(lib, "ws2_32.lib")#pragmacomment(lib, "lib/libbaseclasses-i386-Win32-vc8-Debug.l
2016-03-16 22:52:51
2365
原创 VS2005编译PJSIP库
1 安装DXSDK.exe。2 新建一个config_site.h文件,放在pjlib/include/pj目录下3 平台选择win32。4 将pjsua项目设为启动项。5 dsound.lib链接通不过,设置包含库目录,包括到X86。lib在每个文件夹的lib文件夹中,exe在pjsip-apps/bin文件夹下。
2016-03-13 21:18:20
1177
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅