自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(185)
  • 资源 (7)
  • 收藏
  • 关注

原创 WebRTC QoS方法十三.2(Jitter延时的计算)

一些报文在网络传输中,会存在丢包重传和延时的情况。渲染时需要进行适当缓存,等待丢失被重传的报文或者正在路上传输的报文。jitter延时计算就是确认需要缓存的时间。

2024-07-23 11:15:15 1170

原创 WebRTC QOS方法十三.1(TimestampExtrapolator接收时间预估)

虽然我们可通过时间戳的差值和采样率计算出发送端视频帧的发送节奏,但是由于网络延迟、抖动、丢包,仅知道视频发送端的发送节奏是明显不够的。我们还需要评估出视频接收端的视频帧的接收节奏,然后进行适当平滑,保证渲染的效果。WebRTC引入了卡尔曼滤波,通过视频时间戳和到达时间进行调整,提高后续视频帧到达时间估算的准确性和稳定性。TimestampExtrapolator就是实现视频帧的到达时间的估算。在实际的网络环境中,由于网络波动、设备性能差异等因素,接收到的视频帧时间戳往往包含噪声。

2024-07-19 14:18:36 744

原创 WebRTC QoS方法十三(视频渲染平滑)

视频渲染时间的确定需要考虑三方面的因素:网络抖动、网络延时、音视频同步网络抖动:视频帧在网络上传输,会受到网络抖动的影响,不能收到立刻播放,需要进行适当的平滑网络延时:一些报文在网络传输中,会存在丢包重传的情况。渲染时需要进行适当缓存,等待丢失被重传的报文音视频同步:音视频报文传送到接收端,也不能完全保证同时接收。需要做一些时间校准,保证音视频偏差不影响体验所以在计算视频渲染时间的时候,会结合这三方面的参数,计算一个合理值。

2024-07-18 17:48:23 1191

原创 移动通信相关知识学习笔记

移动无线的接入网是专指各种基站设备。核心网就是各种交换机。

2024-02-19 19:10:05 2386 1

原创 编码基础一:侵入式链表

侵入式链表中的节点只有地址信息,如何访问节点上的数据成员变量,核心函数是:offsetof。

2023-08-25 17:12:11 1477

原创 WebRTC QoS方法之FlexFEC 实现优化点

以单帧10个媒体报文,冗余度20%为例。这里webrtc输出要有10个媒体包2个冗余包。webrtc输出的报文序列如下:代码实现如下:UlpfecGenerator::AddPacketAndGenerateFec:攒够足够的帧ForwardErrorCorrection::EncodeFec:根据媒体报文个数和冗余度,计算要生成的冗余报文个数。

2023-07-21 10:21:26 863

原创 webrtc代码走读二十六(rtcp打包模式及流程)

Compound mode 遵循 RFC 4585ReducedSize mode遵循 RFC 5506两种模式的差别:1、Compound模式RTCP报文里面必须包含RR or SR and CNAME SDES才能发送报文。这样会导致RTCP报文size比较大,另外对于feedback反馈报文的响应速度也比较慢。

2023-07-13 15:06:03 517 2

原创 webrtc代码走读二十一(RtpPacketToSend数据buffer的申请和释放)

至此数据buffer申请完毕,可以看出这里的数据buffer是一个std::unique_ptr data_类型。

2023-06-28 16:07:09 482 1

原创 webrtc代码走读五(音频neteq代码走读)

std::unique_ptr frame里面挂了解码器的句柄,就是说每个报文都指定了自己的解码器句柄。std::unique_ptr stats_:更新报文之间时间间隔,用于确定jitterbuffer缓存时间。std::unique_ptr nack_:更新收包信息,便于确定需要nack重传的报文。封装输出音频PCM帧数据。

2023-06-27 17:21:08 400

原创 Mark:查询 Linux 内核应用的 TCP 拥塞控制算法

【代码】Mark:查询 Linux 内核应用的 TCP 拥塞控制算法。

2023-04-04 13:44:58 1328 1

原创 WebRTC QoS优化(双链路笔记)

手机设备有wifi和cellular网络,两种都是无线信号,可能由于一些距离wifi、基站覆盖等原因会出现一段时间网络变差的情况。可以考虑使用wifi和cellular智能切换,保证音视频传输的流畅性。并且可以善意提醒用户,当前wifi信号差,正在使用流量。提醒用户主动改善网络条件。

2023-03-24 15:00:09 1132

原创 ffmpeg h264 动态分辨率解码流程

实测ffmpeg init 264 decode的时候,配置的是1080p的分辨率,直接来360p的数据,可以正常解析,反之init配置360p分辨率,实际来1080p数据,也可以正常解析。

2023-03-17 14:02:24 1073

原创 h264编码概述八(哥伦布编码ue(v))

熵编码是无损编码的一种方法。该编码方法的宗旨是找到一种编码,使得码字的平均码长达到熵极限。具体实施是,对出现概率较大的符号,取较短的码长,对出现概率较小的符号取较大的码长。H.264中使用的熵编码有:指数哥伦布编码、CAVLC、CABAC。本次仅分析指数哥伦布编码方法。其中ue(v)是其他变型算法的基础,其他算法的结果由ue(v)的结果进一步处理得到。ue(v)的码字分为三个部分:[prefix] + 1+ [surfix][prefix]为连续n个0。

2023-03-08 10:11:22 1347

原创 h264编码概述七(SPS解析)

H.264标准协议中规定的SPS格式位于文档的7.3.2.1.1,如下图所示:根据《T-REC-H.264-201402-I!!PDF-E》的附件A.2定义,profiles有如下类型:profile_idc的值用来确定码流符合哪一种档次。profiles66778810011012244辅助profile_idc确定编码的profiles。constraint_set0_flag 等于1是指比特流遵从A.2.1节中的所有规定。

2023-03-07 11:48:56 2712

原创 OpenTracing协议规范链接

OpenTracing标准(中文版) `zh` (Chinese) translation of the opentracing/specification - GitHub - opentracing-contrib/opentracing-specification-zh: OpenTracing标准(中文版) `zh` (Chinese) translation of the opentracing/specification。需要参考OpenTelemetry官网链接。

2023-02-15 14:24:21 671

原创 视频卡顿率测试方法

ITU-R BT.1788 建议书对TI:temporal information、SI,Spatial perceptual Information的介绍。SI表征一帧图像的空间细节量。空间上越复杂的场景,SI值越高。SI计算方法:对第n帧视频进行Sobel滤波,然后对滤波后图像计算标准差。选这些帧中的最大值为SI。TI表征视频序列的时间变化量。运动程度较高的序列通常会有更高的TI值。TI计算方法:求n与n-1帧图像的帧差,然后对帧差图像计算标准差。选这些帧中的最大值为TI。

2022-11-29 11:15:55 3869 1

原创 marker:aac码率取值范围及profile注意事项

比较常使用的profile是 LC、HE-AAC、HE-AACv2。但是注意,HE-AACv2有些浏览器播放不了。1、libfdk-aacenc的profile有五种:LC、HE-AAC、HE-AACv2、LD、ELD。参见ffmpeg代码libfdk-aacenc.c文件对profiles的定义。备注说明:LC建议码率 64kbps - 120kbps。

2022-09-07 19:38:07 1087

原创 maker:centos tc模拟网络损伤工具

1、系统自带该工具,无须另外安装。2、模拟网络丢包命令行。3、模拟网络延时命令行。

2022-09-01 17:32:56 498

原创 h264编码笔记(nal_ref_idc)

X264关于nal_ref_idc的枚举定义:nal_ref_idc不等于0时,规定NAL单元的内容包含一个序列参数集,或一个图像参数集,或一个参考图像条带,或一个参考图像的条带数据分割。如果一个包含一个条带或条带数据分割的NAL 单元的nal_ref_idc等于0时,该条带或条带数据分割是一个非参考图像的一部分。对于序列参数集或序列参数集扩展或图像参数集的NAL单元,nal_ref_idc不应等于0。......

2022-08-15 17:08:50 1759

原创 webrtc代码走读二十四(RTT延时计算)

WebRTC中有两种方式计算RTT基于媒体流发送端的计算。通过SenderReport(SR)和ReceiverReport(RR)携带的信息计算。基于媒体流接收端的计算。通过RTCPExtendedReportsRTCP(XR)携带ReceiverReferenceTimeReportBlock和DLRRReportBlock的信息。两种方式计算RTT的原理一样。......

2022-07-22 20:08:16 2219

原创 webrtc QOS方法二.3(flexfec rfc8627简介)

WebRTC实现的冗余方式有三种:UlpFEC(rfc5109)、FlexFEC(rfc8627)、inbandFEC(opus音频使用)。UlpFEC和FlexFEC实现的原理都是,将一组M个报文进行异或,生成N(N就是FEC的冗余度)个FEC报文,打包出去。这组报文任意丢其中的N个,都可以通过这组(M-N)个报文+FEC冗余包恢复回来,增大FEC冗余报文的保护范围。例如下面示意图:D为媒体包,R为冗余包,该图所示的冗余度为2。1、发送端打包示意图 2、网络丢包示意图 3、报文恢复示意图 1、WebRTC

2022-07-11 16:22:57 2708 15

原创 H5使用笔记:安卓手机上查看H5页面日志信息

1、手机上安装安卓版本的chrome浏览器2、开启开发者选项->USB调试功能3、在PC端,在chrome浏览器打开chrome://inspect/#devices4、点击inspect fallback,查看对应日志信息。

2022-05-16 17:15:58 2825

原创 webrtc QOS方法十二(接收端IDR帧请求)

1、解码前长时间要不到帧,IDR帧请求webrtc的接收端根据时间控制I帧请求是在解码前要包里面实现的。在指定时间内没有要到包,就发送I帧请求。VideoReceiveStream2::StartNextDecodeRtpVp8RefFinder::ManageFrame组帧这里也不主动发送I帧请求,组帧的动作只有三个,缓存、丢弃、传输视频帧到frame_buffer_队列。解码在frame_buffer_队列要不到数据了,才发I帧请求的2、NACK空洞大于kMaxN..

2022-05-06 17:09:05 991

原创 marker:x86-64寄存器参数详解

一、x86-64寄存器参数列表详细参数信息:八个通用寄存器:名称 简介 EAX (针对操作数和结果数据的)累加器 ,返回函数结果 EBX (DS段中的数据指针)基址寄存器。在内存寻址时存放基地址 ECX (字符串和循环操作数)计数器。时重复REP前缀指令和LOOP指令的内定计数器 EDX (I/O指针)数据寄存器 EBP (SS段中栈内数据指针)扩展基址指针寄存器 ESP (SS段中栈指针)

2022-04-14 15:58:59 3907 1

原创 mark:adb命令读取安卓手机文件&安装apk&获取运行日志

一、预置条件二、adb命令行查询文件夹1、adb devices查询链接设备列表2、adb -s RFCNC0V712R shell 打开shell找到文件路径后记录下来,使用pull命名获取。三、adb命令获取指定文件使用exit退出shell,使用如下命令行获取抓包文件adb -s RFCNC0V712R pull /storage/emulated/0/xxxx/pcap E:\\1111......

2022-03-17 18:50:27 11020

原创 marker:webrtc抓包数据分析

一、单向抓包RTP数据列表报文分析:PT=111为opus音频数据。PT=124为opus音频的NACK报文。PT=127为H264视频数据。PT=125为H264视频的NACK报文,PT=107为H264视频的FlexFEC。二、PT为124音频报文NACKyuany

2022-03-17 00:19:13 1729 1

原创 webrtc音频QOS方法四(音频接收端NACK流程实现)

一、概述发送端的音视频NACK实现没有差异,可以公用一套rtp_packet_history代码,但是在接收端,音视频NACK实现细节是不一样的。视频接收端NACK实现函数是NackModule2,音频接收端NACK实现函数是NackTracker。音视频NACK实现差异主要有两点:视频NACK满足一定条件会进行IDR帧请求:视频模块会配置nack_list的最大长度为kMaxNackPackets,即本次发送的nack包至多可以对kMaxNackPackets个丢失的包进行重传请求。如果丢

2022-03-02 19:43:16 979

原创 webrtc代码走读:发送端NACK和FEC的packet压到队列走读

一、NACK发送端packet data和FEC的packet data push到packet队列函数调用栈PacingController::ProcessPackets()->PacketRouter::SendPacket(std::unique_ptr<RtpPacketToSend>,const PacedPacketInfo&)->ModuleRtpRtcpImpl2::TrySendPacket(RtpPacketToSend*, const Pac

2022-02-24 16:17:52 1476

原创 mark:ffmpeg的av_interleaved_write_frame写失败

1、首先需要确认返回码含义,可使用如下打印int ret = av_interleaved_write_frame(that->_rtmp_format_context, pkt);if (ret < 0) { char errbuf[100]; av_strerror(ret, errbuf, sizeof(errbuf)); LOG_P(LOG_ERROR, "RTMP interleave write frame error %s \n", errbuf);

2022-02-14 08:38:52 3411

原创 ffmpeg之avio_alloc_context函数解读笔记

一、avio_read函数调用栈av_read_frame->read_frame_internal->ff_read_packet->s->iformat->read_packet(以ff_yuv4mpegpipe_demuxer为例)->av_get_packet->append_packet_chunked->avio_readffmpeg这么做的好处是,在...

2022-01-04 20:51:38 4480

原创 ffmpeg之pcm音频参数笔记

一、概述ffmpeg音频参数主要有如下四个:1、声道数(nb_channels):常见的有单声道,双声道,5.1环绕立体声道。2、采样频率(nb_samples):每秒钟取得声音样本的次数。如下图所示,把音频文件放大,实际上都是一个一个的点,一秒钟有多少个横坐标的点,就是该音频的采样频率。3、采样深度 (sample_fmt):比特深度决定了文件的动态分辨率,类似照片分辨率。每个样本所含的比特越多,代表着动态范围越大。这并不意味,比特深度越高,音量越大;而是更高的比特深度听起来会更.

2021-12-31 17:54:40 4925 2

原创 mark:命名管道学习笔记

一、简介命名管道(NamedPipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是:命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。二、接口函数介绍服务端使用函数 创建命名管道 CreateNamedPipe 创建命名管道 ConnectNamedPipe 服务器端等待客户端连接命名管道。若调用此函数之前,客户端已经调用

2021-12-30 16:56:37 774

原创 mark:Kafka

1、代码下载路径Apache Downloads2、快速搭建Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/quickstart3、功能概述 比较好的链接Kafka原理和源码(一):Kafka基础 | 文章 | BEWINDOWEBKafka原理和源码(一):Kafka基础,文中介绍了一、Kafka的名字是怎么来的我一直就怀疑是不是初中学的小说家“弗朗...

2021-11-30 11:37:53 186

原创 webrtc代码走读二十一(采集视频旋转功能)

一、简介VideoCaptureImpl::SetApplyRotation/VideoCaptureImpl::SetCaptureRotation可以动态配置采集到的视频数据旋转角度。然后通过RTP扩展头的kRtpExtensionVideoRotation字段发送给接受端。让接收端做自适应调整。二、发送端实现1、get camera data调用栈videocapturemodule::CaptureInputPin::Receive()->videocapturemodule

2021-11-29 11:50:12 1293

原创 windows环境下编译ffmpeg

一、概述官网链接:CompilationGuide – FFmpeg https://trac.ffmpeg.org/wiki/CompilationGuide在官网上介绍了四种windows上的编译方法,这里仅试了第一种。

2021-11-24 18:03:59 3104

原创 webrtc代码走读二十二(RtpPacketSender函数钩子注册)

一、视频RtpPacketSender函数钩子注册1)函数调用栈Thread::PreRun->Thread::ProcessMessages->Thread::Dispatch->Thread::QueuedTaskHandler::OnMessage->SdpOfferAnswerHandler::PushdownMediaDescription->BaseChannel::SetRemoteContent->VideoChannel::SetR

2021-11-02 15:04:13 639

原创 webrtc代码走读二十一(InterArrival::ComputeDeltas)

一、函数调用栈internal::Call::DeliverRtcp->RtpVideoSender::DeliverRtcp->ModuleRtpRtcpImpl2::IncomingRtcpPacket->RTCPReceiver::IncomingPacket->RTCPReceiver::IncomingPacket->RTCPReceiver::TriggerCallbacksFromRtcpPacket(const webrtc::RTCPRecei

2021-10-30 00:24:37 495

原创 webrtc QOS方法四.5(gcc获取码率pacer、fec、编码器配置)

一、gcc获取码率后,码率分配函数调用栈信息如下:二、RtpTransportControllerSend::PostUpdates函数配置码率函数三、GoogCcNetworkController::GetPacingRates:pacing_factor_默认2.5。也就是说pacer发送报文的码率是探测码率的2.5倍。四、RtpVideoSender::OnBitrateUpdated:根据探测码率、当前帧率、丢包率、rtt环路延时、丢包模型,确定编码器的码率。...

2021-10-20 17:53:53 1306 4

原创 mark:linux获取系统时间

static const int64_t kNumMillisecsPerSec = INT64_C(1000);static const int64_t kNumMicrosecsPerSec = INT64_C(1000000);static const int64_t kNumNanosecsPerSec = INT64_C(1000000000);static const int64_t kNumMicrosecsPerMillisec = kNumMicrosecsPerSec .

2021-10-19 08:35:43 262

原创 webrtc代码走读二十:extension扩展头协商及初始化流程

wWinMain->MainWnd::PreTranslateMessage->MainWnd::OnDefaultAction->Conductor::ConnectToPeer->Conductor::InitializePeerConnection->Conductor::AddTracks->PeerConnection::AddTrack->RtpTransmissionManager::AddTrack->RtpTransmissi

2021-09-08 17:22:42 951

使用std::optional替换absl::optional需要包含的头文件

使用std::optional替换absl::optional需要包含的头文件。替换对abseil-cpp开源软件的依赖。

2023-04-04

H5网页标准SDP协商日志

WebRTC Internals H5网页标准SDP协商日志信息

2022-09-07

x265.exe demo

x265.exe --input black.yuv --input-res 1280x720 xxx.265 --log-level debug 可以查看numa架构打印

2021-08-16

webrtc_demo_withlog.tar

webrtc客户端和信令服务器demo,client客户端自动生成日志

2021-07-07

graphstudio.rar

查看和配置windows下设备管理器属性

2021-06-03

vmafossexec.rar

命令行:vmafossexec yuv420p 640 480 ref.yuv test.yuv vmaf_v0.6.1.pkl --psnr --ssim --log test.txt

2019-05-17

psnr_ssim_analyzer.exe

一、命令行 psnr_ssim_analyzer.exe --height=480 --width=640 --reference_file=ref.yuv --test_file=test.yuv --results_file=test.csv 二、代码来源及修订记录: 1、该工具是根据webrtc的psnr_ssim_analyzer.cc源码修改,webrtc源码有bug,没有判断文件是否结束。导致计算结果异常。 2、优化写结果格式,可以在excel中打开,进行统计分析。 三、修改webrtc代码点: bool ExtractFrameFromYuvFile&#40;const char* i420_file_name, int width, int height, int frame_number, uint8_t* result_frame&#41; { int frame_size = GetI420FrameSize(width, height); int64_t offset = frame_number * frame_size; // Calculate offset for the frame. bool errors = false; FILE* input_file = fopen&#40;i420_file_name, "rb"&#41;; if (input_file == NULL) { fprintf(stderr, "Couldn't open input file for reading: %s\n", i420_file_name); return false; } fseek (input_file, 0, SEEK_END); int64_t file_size = ftell(input_file); if (offset > file_size) { fprintf(stderr, "the end %s frame_number:%d frame_size:%d file_size:%lld offset:%lld\n", i420_file_name, frame_number, frame_size, file_size, offset); return false; } // Change stream pointer to new offset. fseek(input_file, offset, SEEK_SET); size_t bytes_read = fread(result_frame, 1, frame_size, input_file); if (bytes_read != static_cast(frame_size) && ferror(input_file)) { fprintf(stdout, "Error while reading frame no %d from file %s\n", frame_number, i420_file_name); errors = true; } fclose(input_file); return !errors; }

2019-05-16

写日志文件代码

实现日志写文件功能,并且优化日志打印内容,增加时间、文件名、行号信息。

2018-12-28

webrtc vp8_rtp抓包样例

在webrtc系统上捕获的VP8无FEC、SRTP的RTP报文,用于VP8协议分析。

2018-10-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除