- 博客(187)
- 资源 (7)
- 收藏
- 关注
原创 音频客观测评方法PESQ
语音质量感知评估(Perceptual Evaluation of Speech Quality)是一系列的标准,包括一种用于自动评估电话系统用户所体验到的语音质量的测试方法。该标准于2001年被确定为ITU-T P.862建议书[1]。PESQ被电话制造商、网络设备供应商和电信运营商用于客观的语音质量测试。PESQ的继任者POLQA(ITU-T P.863建议书[2])的第一版于2011年生效。
2024-12-11 16:09:23
1755
原创 RTC QoS方法十三.(ReedSolomonFEC简介)
在使用FlexFEC进行冗余的时候,经验值需要冗余5倍的丢包率,才能有比较高的恢复率。Flex FEC在2D数组异或时能获得比较高的恢复率,但是如上图所示,25个包发送10个FEC包,成本为10/25=40%的冗余度。理论上加入10个冗余包,最多可以恢复10个丢包。但是该方案不能恢复任意组合的丢包,比如丢掉了1、2、6、7这4个包,将无法恢复。因为这个方案是10个一阶的FEC的组成,一阶代表只能处理一个丢包。我们若想要达到冗余N个包,随意丢失任意组合的N个包,都能完全的恢复,矩阵需要可逆。
2024-11-21 15:24:35
1327
原创 WebRTC QoS方法十三.2(Jitter延时的计算)
一些报文在网络传输中,会存在丢包重传和延时的情况。渲染时需要进行适当缓存,等待丢失被重传的报文或者正在路上传输的报文。jitter延时计算就是确认需要缓存的时间。
2024-07-23 11:15:15
1949
1
原创 WebRTC QOS方法十三.1(TimestampExtrapolator接收时间预估)
虽然我们可通过时间戳的差值和采样率计算出发送端视频帧的发送节奏,但是由于网络延迟、抖动、丢包,仅知道视频发送端的发送节奏是明显不够的。我们还需要评估出视频接收端的视频帧的接收节奏,然后进行适当平滑,保证渲染的效果。WebRTC引入了卡尔曼滤波,通过视频时间戳和到达时间进行调整,提高后续视频帧到达时间估算的准确性和稳定性。TimestampExtrapolator就是实现视频帧的到达时间的估算。在实际的网络环境中,由于网络波动、设备性能差异等因素,接收到的视频帧时间戳往往包含噪声。
2024-07-19 14:18:36
1012
原创 WebRTC QoS方法十三(视频渲染平滑)
视频渲染时间的确定需要考虑三方面的因素:网络抖动、网络延时、音视频同步网络抖动:视频帧在网络上传输,会受到网络抖动的影响,不能收到立刻播放,需要进行适当的平滑网络延时:一些报文在网络传输中,会存在丢包重传的情况。渲染时需要进行适当缓存,等待丢失被重传的报文音视频同步:音视频报文传送到接收端,也不能完全保证同时接收。需要做一些时间校准,保证音视频偏差不影响体验所以在计算视频渲染时间的时候,会结合这三方面的参数,计算一个合理值。
2024-07-18 17:48:23
1608
原创 WebRTC QoS方法之FlexFEC 实现优化点
以单帧10个媒体报文,冗余度20%为例。这里webrtc输出要有10个媒体包2个冗余包。webrtc输出的报文序列如下:代码实现如下:UlpfecGenerator::AddPacketAndGenerateFec:攒够足够的帧ForwardErrorCorrection::EncodeFec:根据媒体报文个数和冗余度,计算要生成的冗余报文个数。
2023-07-21 10:21:26
1086
原创 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
655
2
原创 webrtc代码走读二十一(RtpPacketToSend数据buffer的申请和释放)
至此数据buffer申请完毕,可以看出这里的数据buffer是一个std::unique_ptr data_类型。
2023-06-28 16:07:09
556
1
原创 webrtc代码走读五(音频neteq代码走读)
std::unique_ptr frame里面挂了解码器的句柄,就是说每个报文都指定了自己的解码器句柄。std::unique_ptr stats_:更新报文之间时间间隔,用于确定jitterbuffer缓存时间。std::unique_ptr nack_:更新收包信息,便于确定需要nack重传的报文。封装输出音频PCM帧数据。
2023-06-27 17:21:08
546
原创 WebRTC QoS优化(双链路笔记)
手机设备有wifi和cellular网络,两种都是无线信号,可能由于一些距离wifi、基站覆盖等原因会出现一段时间网络变差的情况。可以考虑使用wifi和cellular智能切换,保证音视频传输的流畅性。并且可以善意提醒用户,当前wifi信号差,正在使用流量。提醒用户主动改善网络条件。
2023-03-24 15:00:09
1348
原创 ffmpeg h264 动态分辨率解码流程
实测ffmpeg init 264 decode的时候,配置的是1080p的分辨率,直接来360p的数据,可以正常解析,反之init配置360p分辨率,实际来1080p数据,也可以正常解析。
2023-03-17 14:02:24
1246
原创 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
1706
原创 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
3179
原创 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
745
原创 视频卡顿率测试方法
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
4443
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
1312
原创 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
2076
原创 webrtc代码走读二十四(RTT延时计算)
WebRTC中有两种方式计算RTT基于媒体流发送端的计算。通过SenderReport(SR)和ReceiverReport(RR)携带的信息计算。基于媒体流接收端的计算。通过RTCPExtendedReportsRTCP(XR)携带ReceiverReferenceTimeReportBlock和DLRRReportBlock的信息。两种方式计算RTT的原理一样。......
2022-07-22 20:08:16
2590
原创 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
3166
15
原创 H5使用笔记:安卓手机上查看H5页面日志信息
1、手机上安装安卓版本的chrome浏览器2、开启开发者选项->USB调试功能3、在PC端,在chrome浏览器打开chrome://inspect/#devices4、点击inspect fallback,查看对应日志信息。
2022-05-16 17:15:58
3225
原创 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
1086
原创 marker:x86-64寄存器参数详解
一、x86-64寄存器参数列表详细参数信息:八个通用寄存器:名称 简介 EAX (针对操作数和结果数据的)累加器 ,返回函数结果 EBX (DS段中的数据指针)基址寄存器。在内存寻址时存放基地址 ECX (字符串和循环操作数)计数器。时重复REP前缀指令和LOOP指令的内定计数器 EDX (I/O指针)数据寄存器 EBP (SS段中栈内数据指针)扩展基址指针寄存器 ESP (SS段中栈指针)
2022-04-14 15:58:59
4390
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
11342
原创 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
2014
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
1073
原创 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
1591
原创 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
3617
原创 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
4825
原创 ffmpeg之pcm音频参数笔记
一、概述ffmpeg音频参数主要有如下四个:1、声道数(nb_channels):常见的有单声道,双声道,5.1环绕立体声道。2、采样频率(nb_samples):每秒钟取得声音样本的次数。如下图所示,把音频文件放大,实际上都是一个一个的点,一秒钟有多少个横坐标的点,就是该音频的采样频率。3、采样深度 (sample_fmt):比特深度决定了文件的动态分辨率,类似照片分辨率。每个样本所含的比特越多,代表着动态范围越大。这并不意味,比特深度越高,音量越大;而是更高的比特深度听起来会更.
2021-12-31 17:54:40
5142
2
原创 mark:命名管道学习笔记
一、简介命名管道(NamedPipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是:命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。二、接口函数介绍服务端使用函数 创建命名管道 CreateNamedPipe 创建命名管道 ConnectNamedPipe 服务器端等待客户端连接命名管道。若调用此函数之前,客户端已经调用
2021-12-30 16:56:37
854
原创 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
219
原创 webrtc代码走读二十一(采集视频旋转功能)
一、简介VideoCaptureImpl::SetApplyRotation/VideoCaptureImpl::SetCaptureRotation可以动态配置采集到的视频数据旋转角度。然后通过RTP扩展头的kRtpExtensionVideoRotation字段发送给接受端。让接收端做自适应调整。二、发送端实现1、get camera data调用栈videocapturemodule::CaptureInputPin::Receive()->videocapturemodule
2021-11-29 11:50:12
1455
原创 windows环境下编译ffmpeg
一、概述官网链接:CompilationGuide – FFmpeg https://trac.ffmpeg.org/wiki/CompilationGuide在官网上介绍了四种windows上的编译方法,这里仅试了第一种。
2021-11-24 18:03:59
3288
原创 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
768
原创 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
557
原创 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
1435
4
使用std::optional替换absl::optional需要包含的头文件
2023-04-04
x265.exe demo
2021-08-16
vmafossexec.rar
2019-05-17
psnr_ssim_analyzer.exe
2019-05-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人