DVPP媒体数据处理视频解码问题案例(2)

DVPP(Digital Vision Pre-Processing)是昇腾AI处理器内置的图像处理单元,通过AscendCL媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括图像编解码、视频编解码、图像抠图缩放等。

往期分享过几个DVPP视频解码问题的典型案例(单击Link查看),看的人多,说明在这一块,大家还是有些疑问的,所以本期继续分享其它DVPP视频解码问题的典型案例,并给出原因分析及解决方法:

  1. 视频解码丢帧/丢包,导致出现重影或不连续现象
  2. 视频解码不触发回调函数,导致获取不到解码结果
  3. 复用输出图片描述类型,VDEC视频解码报错,提示有不支持的图片格式

01 视频解码丢帧/丢包,导致出现重影或不连续现象

问题现象&可能原因

视频解码丢帧,出现重影或不连续现象。查看Device侧日志,发现日志中存在以下几个报错中的一个或多个,不同版本日志信息可能有所不同。

  • H264码流缺少IDR帧,日志报错示例(1)
[HiDvpp][A618] [Vfmw]:ppssps_check [Line]:6803 pps with this pic_parameter_set_id = %d haven't decode
[HiDvpp][A618] [Vfmw]:process_slice_header_first_part [Line]:7401 PPS or SPS of this slice not valid
[HiDvpp][A618] [Vfmw]:h264_dec_slice [Line]:7915 sliceheader dec err

[ERROR] DVPP:2020-12-31-23:51:51.339.518 [VDEC][PPSSPSCheckTmpId:7065][T3]  PPSSPSCheckTmpId: pps with this pic_parameter_set_id = 0 haven't decode
[ERROR] DVPP:2020-12-31-23:51:51.339.616 [VDEC][ProcessSliceHeaderFirstPart:7627][T3]  PPS or SPS of this slice not valid
[ERROR] DVPP:2020-12-31-23:51:51.339.678 [VDEC][InquiresSlceProperty:10582][T3]  sliceheader dec err
  • H264码流缺少I帧,日志报错示例(2)
[HiDvpp][A618] [Vfmw]:h264_dec_slice [Line]:7983 init pic err, find next recover point or next valid sps, pps, or exit
[HiDvpp][A618] [Vfmw]:h264_dec_slice [Line]:3716 dec list error, ret=-1
[HiDvpp][A618] [Vfmw]:receive_packet [Line]:10676 nal_release_err

[ERROR] DVPP:2020-12-31-20:51:51.318.218 [VDEC][InitPic:6039][T3]  line 6039: frame gap(=48) > dpb size(=2)
[ERROR] DVPP:2020-12-31-20:51:51.318.266 [VDEC][H264_DecSlice:8238][T3]  init pic err, find next recover point or next valid sps, pps, or exit
[ERROR] DVPP:2020-12-31-20:51:51.318.336 [VDEC][H264_DecOneNal:10077][T3]  DecList error, ret=-1
[ERROR] DVPP:2020-12-31-20:51:51.318.392 [VDEC][ReceivePacket:10400][T3]  nal_release-err
  • H264码流缺少P帧,日志报错示例(3)
[HiDvpp][A618] [Vfmw]:init_list_x [Line]:4829 for P slice size of list equal 0.ctx->dpb.ref_frames_in_buffer:0.
[HiDvpp][A618] [Vfmw]:dec_list [Line]:5068 init list error.
[HiDvpp][A618] [Vfmw]:h264_dec_list [Line]:4829 dec_list error, ret=-1
[HiDvpp][A618] [Vfmw]:h264_dec_one_nal [Line]:10298 slice_check failed, clear current slice.

[ERROR] DVPP:2020-12-31-20:30:22.188.008 [VDEC][InitListX:4513][T3]  for P slice size of list equal 0.
[ERROR] DVPP:2020-12-31-20:30:22.188.056 [VDEC][DecList:4832][T3] line: 4832 InitListX failed
[ERROR] DVPP:2020-12-31-20:30:22.188.128 [VDEC][H264_DecSlice:8260][T3] DecList error, ret=-1
[ERROR] DVPP:2020-12-31-20:30:22.188.199 [VDEC][H264_DecOneNal:10077][T3] Decoder Slice failed
  • H264码流缺少B帧,日志报错示例(4)
[HiDvpp][A618] [Vfmw]:init_list_x [Line]:4865 for B slice size of two list all equal 0.
[HiDvpp][A618] [Vfmw]:dec_list [Line]:5068 init list error.
[HiDvpp][A618] [Vfmw]:h264_dec_list [Line]:4829 dec_list error, ret=-1

[ERROR] DVPP:2020-12-31-10:20:28.528.090 [VDEC][InitListX:4653][T3] for B slice size of two list all equal 0.
[ERROR] DVPP:2020-12-31-10:20:28.528.168 [VDEC][DecList:4830][T3] line: 4832 InitListX failed
[ERROR] DVPP:2020-12-31-10:20:28.528.266 [VDEC][H264_DecSlice:8257][T3] DecList error, ret=-1
  • H265码流缺少IDR帧,日志报错示例(5)
[HiDvpp][A618] [Vfmw]:hevc_vps_sps_pps_check [Line]:7300 pps with this pic_parameter_set_id = 0 haven't be decoded
[HiDvpp][A618] [Vfmw]:hevc_dec_slice_segment_header [Line]:3857 hevc_vps_sps_pps_check != HEVC_DEC_NORMAL
[HiDvpp][A618] [Vfmw]:hevc_inquire_slice_property [Line]:9004 hevc_dec_slice_segment_header dec err
[HiDvpp][A618] [Vfmw]:hevc_dec_decode_packet[Line]:9004 hevc_inquire_slice_property error.

[ERROR] DVPP:2020-12-31-10:30:22.130.500 [VDEC][HEVC_VpsSpsPpsCheck:8084][T10] pps with this pic_parameter_set_id = 0 haven't be decoded
[ERROR] DVPP:2020-12-31-10:30:22.130.598 [VDEC][HEVC_DecSliceSegmentHeader:2793][T10] HEVC_VpsSpsPpsCheck != HEVC_DEC_NORMAL
[ERROR] DVPP:2020-12-31-10:30:22.130.686 [VDEC][HEVC_InquireSliceProperty:10169][T10] HEVC_DecSliceSegmentHeader dec err
[ERROR] DVPP:2020-12-31-10:30:22.130.789 [VDEC][HEVCDEC_DecodePacket:753][T10] HEVC_InquireSliceProperty error.
  • H265码流缺少I帧或者P帧,日志报错示例(6)
[HiDvpp][A618] [Vfmw]:hevc_ref_pic_process [Line]:3474 ref frame(poc 15) lost.
[HiDvpp][A618] [Vfmw]:hevc_create_lost_picture [Line]:5839 DPB no suited fs for lost pic.
[HiDvpp][A618] [Vfmw]:hevc_create_lost_picture [Line]:5847 take poc(17) to create lost poc(15).

[ERROR] DVPP:2020-12-31-11:22:28.800.158 [VDEC][HEVC_RefPicProcess:2480][T10] Ref frame(poc 15) lost.
[ERROR] DVPP:2020-12-31-11:22:28.800.236 [VDEC][HEVC_CreateLostPicture:6392][T10] DPB no suited fs for lost pic.
[ERROR] DVPP:2020-12-31-11:22:28.800.352 [VDEC][HEVC_RefPicProcess:2480][T10] Ref frame(poc 18) lost.
[ERROR] DVPP:2020-12-31-11:22:28.800.426 [VDEC][HEVC_CreateLostPicture:6392] [T10] DPB no suited fs for lost pic.
[ERROR] DVPP:2020-12-31-11:22:28.800.522 [VDEC][HEVC_RefPicProcess:2480] [T10] Ref frame(poc 18) lost.
  • H265码流缺少I帧或者B帧,日志报错示例(7)
[ERROR] DVPP:2020-12-31-11:56:35.038.109 [VDEC][HEVC_RefPicProcess:2480] [T56] Ref frame(poc 15) lost.
[ERROR] DVPP:2020-12-31-11:56:35.038.283 [VDEC][HEVC_CreateLostPicture:6392] [T56] Take poc(17) to create lost poc(15).
[ERROR] DVPP:2020-12-31-11:56:35.038.502 [VDEC][FSP_SetRef:934] [T56] check condition: pstLogicFs->IsDummyFs == 0 fail
[ERROR] DVPP:2020-12-31-11:56:35.038.801 [VDEC][FSP_SetRef:934] [T56] check condition: pstLogicFs->IsDummyFs == 0 fail
[ERROR] DVPP:2020-12-31-11:56:35.039.128 [VDEC][FSP_SetRef:934] [T56] check condition: pstLogicFs->IsDummyFs == 0 fail

处理步骤

  1. 检查输入的源码流是否有问题。

使用第三方工具(如:eseye u)对输入码流进行检查,查看码流是否异常。

  1. 若查看的源码流结果为正常,则可能码流在传输给设备侧VDEC视频解码的过程中遭到破坏,需要在调用发送码流接口之前,通过fwrite函数将输送给VDEC的码流保存下来。
    • 使用第三方工具对保存的码流进行检查,如果码流异常,用户需自行排查将码流送进去之前是否有送流问题。
    • 通过对应版本的sample,解码这段保留下来的码流,验证码流是否正常或VDEC是否支持该格式。

如果sample 解码正常,那就是开发代码有问题,可以参考VDEC示例代码,找到对应的视频解码的代码参考优化。

02 视频解码不触发回调函数导致获取不到解码结果

现象描述

用户输入码流给VDEC解码,某些帧或所有帧都没有触发回调函数,用户收不到解码结果。

可能原因

码流中某些帧是坏帧,导致语法解析不出这些帧的含义,或者解码这些帧失败,从而不调用回调函数。

处理步骤

针对分析的可能原因,请参考以下步骤进行处理:

  1. 查看日志中是否有视频解码丢帧/丢包中的日志报错信息,若有,则是因为异常帧解码失败导致没有回调。
  2. 若没有视频解码丢帧/丢包中的日志报错信息,则设置环境变量(export ASCEND_MODULE_LOG_LEVEL=DVPP=1)将DVPP模块的日志级别设置为info,或设置环境变量(export ASCEND_GLOBAL_LOG_LEVEL=1)将全局日志级别设置为info,查看下述三条日志打印的总次数是否和输入的帧数相等。
    • (1)"The queue is empty, so call the non-intelligent pointer callback interface."
    • (2)"The queue is not empty, so call the smart pointer callback interface."
    • (3)"The queue is not empty, but hiai_data_sp is nullptr."

生成上述3种日志信息的场景如下:

    • 未使用hiai_data_sp,成功解码返回,打印(1)日志,然后调用用户注册的回调函数。
    • 每一帧对应设置一个hiai_data_sp,成功解码返回,打印(2)日志,然后调用用户注册的回调函数。
    • N帧对应设置一个hiai_data_sp,第1帧成功解码返回,打印(2)日志,然后调用用户注册的回调函数;其他N-1帧,成功解码后打印(3)日志信息,并调用用户注册的回调函数。

不论上述场景中哪一种,均会调用用户注册的回调函数,即只要调用一次用户回调函数就说明解码返回一帧。所以上述三条日志出现的次数总和与用户输入总帧数相等,则说明无解码丢帧,用户需排查自身接收解码结果的统计是否有误。

03 复用输出图片描述类型,VDEC视频解码报错提示有不支持的图片格式

现象描述

循环调用aclvdecSendFrame接口解码视频中的每一帧码流时,在遇到异常帧之后,解码下一帧就会报错,退出应用进程。

分别查看Host侧日志、Device侧日志,发现Device日志中提示the out format 0 is not supported,日志片段如下:

  • Device侧日志:
    [ERROR] KERNEL(2234,sklogd):2023-06-13-19:21:22.987.969 [klogd.c:246][652145.056916] [HiDvpp][A618] [Vdec]:vdec_check_resize_param [Line]:6768 pid 23973 usr chn 0 device 0 chn 0 the out format 0 is not supported. 

  • Host侧日志:
    [ERROR] RUNTIME(17174,AIMCDemo):2023-06-13-19:21:23.664.211 [api_c.cc:721]17184 rtStreamSynchronize:[DVPP][DEFAULT]ErrCode=507018, desc=[aicpu exception], InnerCode=0x715002a
    [ERROR] RUNTIME(17174,AIMCDemo):2023-06-13-19:21:23.664.215 [error_message_manage.cc:49]17184 FuncErrorReason:[DVPP][DEFAULT]report error module_type=3, module_name=EE8888
    [ERROR] RUNTIME(17174,AIMCDemo):2023-06-13-19:21:23.664.221 [error_message_manage.cc:49]17184 FuncErrorReason:[DVPP][DEFAULT]rtStreamSynchronize execute failed, reason=[aicpu exception]
    [INFO] GE(17174,AIMCDemo):2023-06-13-19:21:23.664.227 [error_manager.cc:252]17184 ReportInterErrMessage:report error_message, error_code:EE8888, work_stream_id:1717417184
    [ERROR] ASCENDCL(17174,AIMCDemo):2023-06-13-19:21:23.664.234 [video_processor_v200.cpp:1089]17184 aclvdecSendFrame: [DVPP][DEFAULT][Sync][Stream]vdec fail to synchronize sendFrameStream, runtime errorCode = 507018, channelId = 0.

可能原因

检查应用代码,发现循环解码视频中的每一帧码流时,复用aclvdecSendFrame接口的输出图片描述类型acldvppPicDesc,但在下一次解码前没有重新设置输出图片format、width、height、widthStride、heightStride,这时,如果前一帧解码失败,acldvppPicDesc的参数format、width、height、widthStride、heightStride变成默认值0,width、height、widthStride、heightStride为0时,vdec会以实际图片宽高解码输出,但format为0,表示YUV400格式,vdec不支持解码输出该格式,会导致下一帧参数不合法解失败。

处理步骤

优化应用代码逻辑,复用输出图片描述类型acldvppPicDesc时,在下一次解码前需重新设置输出图片format、width、height、widthStride、heightStride。

正例代码片段:

aclError ret;
int restLen = 10;
uint32_t inBufferSize = 0;
void *g_picOutBufferDev;
void *inBufferDev = nullptr;
acldvppPicDesc *picOutputDesc;
size_t dataSize = (INPUT_WIDTH * INPUT_HEIGHT * 3) / 2;
// 申请一个picOutputDesc,每帧复用
picOutputDesc = acldvppCreatePicDesc();
// read file to device memoryReadFileToDeviceMem(filePath.c_str(), inBufferDev, inBufferSize);while (restLen > 0) {// 等待前一个使用picOutputDesc解码帧结束,重新复用picOutputDesc,并针对这一帧重新设置Format、width、height、widthStride、heightStride参数值ret = acldvppSetPicDescFormat(picOutputDesc, static_cast<acldvppPixelFormat>(1)); // 1:YUV420 semi-planner(nv12)ret = acldvppSetPicDescWidth(picOutputDesc, 1920);ret = acldvppSetPicDescHeight(picOutputDesc, 1080);ret = acldvppSetPicDescWidthStride(picOutputDesc, 1920);ret = acldvppSetPicDescHeightStride(picOutputDesc, 1080);ret = acldvppMalloc(&g_picOutBufferDev, dataSize);ret = acldvppSetPicDescData(picOutputDesc, g_picOutBufferDev);ret = acldvppSetPicDescSize(picOutputDesc, dataSize);ret = aclvdecSendFrame(vdecChannelDesc, streamInputDesc, picOutputDesc, nullptr, nullptr);restLen = restLen - 1;
}

反例代码片段:

aclError ret;
int restLen = 10;
uint32_t inBufferSize = 0;
void *g_picOutBufferDev;
void *inBufferDev = nullptr;
acldvppPicDesc *picOutputDesc;
size_t dataSize = (INPUT_WIDTH * INPUT_HEIGHT * 3) / 2;
// 申请一个picOutputDesc,每帧复用,且对Format、width、height、widthStride、heightStride参数值只设置了一次
picOutputDesc = acldvppCreatePicDesc();
ret = acldvppSetPicDescFormat(picOutputDesc, static_cast<acldvppPixelFormat>(1)); // 1:YUV420 semi-planner(nv12)
ret = acldvppSetPicDescWidth(picOutputDesc, 1920);
ret = acldvppSetPicDescHeight(picOutputDesc, 1080);
ret = acldvppSetPicDescWidthStride(picOutputDesc, 1920);
ret = acldvppSetPicDescHeightStride(picOutputDesc, 1080);
// read file to device memory
ReadFileToDeviceMem(filePath.c_str(), inBufferDev, inBufferSize);
while (restLen > 0) {// 等待前一个使用picOutputDesc解码帧结束,重新复用picOutputDesc,但没有重新设置Format、width、height、widthStride、heightStride参数值// 如果前一帧解码失败,picOutputDesc_的参数Format、width、height、widthStride、heightStride变成默认值0,// width、height、widthStride、heightStride为0时,vdec会以实际图片宽高解码输出,但Format为0,表示YUV400格式,vdec不支持解码输出该格式,会导致本帧参数不合法解码失败ret = acldvppMalloc(&g_picOutBufferDev, dataSize);ret = acldvppSetPicDescData(picOutputDesc, g_picOutBufferDev);ret = acldvppSetPicDescSize(picOutputDesc, dataSize);ret = aclvdecSendFrame(vdecChannelDesc, streamInputDesc, picOutputDesc, nullptr, nullptr);restLen = restLen - 1;}

04 更多介绍 

[1]昇腾文档中心:昇腾社区-官网丨昇腾万里 让智能无所不及

[2]昇腾社区在线课程:开发者主页-昇腾社区

[3]昇腾论坛:https://www.hiascend.com/forum

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue学习笔记-Vue3中的Teleport组件

作用 该组件的作用一般用于CSS样式&#xff0c;Teleport能够将写在其中的组件传输到指定位置 使用示范 <!--to中的属性值可以写css选择器&#xff0c;例如 to"#idName"--> <teleport to"body"><div><h3>我是一个弹窗</h3>…

docker配置容器内访问主机服务

当我们在Docker容器中运行应用程序时&#xff0c;有时候需要访问宿主机的IP地址。然而&#xff0c;默认情况下&#xff0c;Docker容器内无法直接使用宿主机的IP地址。为了解决这个问题&#xff0c;Docker提供了一个特殊的主机名 host.docker.internal&#xff0c;使得容器可以轻…

facebook的营销方式

Facebook现在有很多种营销方式&#xff0c;以下是一些常见的方式&#xff1a; 1. 广告投放&#xff1a;可以通过Facebook广告平台进行广告投放&#xff0c;根据不同的目标人群、地理位置和兴趣进行精准定向投放&#xff0c;包括图片广告、视频广告和文字广告等。 2. 社群营销…

【教学类-06-17】20231215 (题目填满55格)X-Y之间“加法题+题”

背景需求&#xff1a; 0-5加法、减法是大班孩子选择较多的题型&#xff0c;因为只有21题&#xff0c;做题速度快&#xff0c;完成后&#xff0c;&#xff0c;他们会问&#xff1a;“后面的空白格子做什么” “可以画画&#xff0c;自己出题目” 但是大部分孩子都不会自己出题目…

【导航栏内容的设置 Objective-C语言】

一、那接下来呢,我们就来做一做,关于导航控制器, 1.设置它顶部的导航栏儿内容的东西, 1)我们刚刚讲过的这个,通过代码去跳转、返回、 2)通过storyboard去跳转、返回、 但是,这两种情况,大家是不是已经注意到,导航栏里面,没有任何内容, 然后呢,返回,这是红色,…

C++ Qt开发:ProgressBar进度条组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍ProgressBar进度条组件的常用方法及灵活运用。…

Mybatis配置-设置(settings)

这些是非常重要的调整&#xff0c;它们修改了MyBatis在运行时的行为方式。下表描述了这些设置以及它们的含义和默认值。 SettingDescriptionValid ValuesDefaultcacheEnabled全局启用或禁用配置在此配置下的任何mapper中的所有缓存。true | falsetruelazyLoadingEnabled全局启…

骨传导耳机可以保护听力吗?一文读懂骨传导耳机和开放式耳机的区别!

由于骨传导耳机通过人体骨骼来传递声音&#xff0c;不经过耳道&#xff0c;不会损伤耳膜以及内毛细胞&#xff0c;所以使用骨传导耳机不仅不会损伤听力&#xff0c;还能在一定程度上起到保护听力的作用。 一、骨传导耳机和开放式耳机的区别是什么&#xff1f; 由于骨传导耳机…

5G工业网关视频传输应用

随着科技的不断进步&#xff0c;5G网络技术已经成为了当前最热门的话题之一。而其中一个引人注目的领域就是5G视频传输和5G工业网关应用。在传统网络通信中&#xff0c;由于带宽和延迟的限制&#xff0c;视频传输常常受到限制&#xff0c;而工业网关应用也存在着链路不稳定、数…

【用三大件写出的开门烟花特效】

又到了一年一度的春节时期啦&#xff01;昨天呢是北方的小年&#xff0c;今天是南方的小年&#xff0c;看到大家可以愉快的放烟花&#xff0c;过大年很是羡慕呀&#xff01;辞旧岁&#xff0c;贺新春&#xff0c;今年我呀要放烟花&#xff0c;过春节&#xff01;&#x1f9e8;。…

[已解决]HttpMessageNotReadableException: JSON parse error: Unexpected character:解析JSON时出现异常的问题分析与解决方案

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

小小手表探索更多 好玩伴也是好帮手

华为儿童手表 5X 不仅是孩子的好玩伴&#xff0c;也是家长的好帮手。全能形态让小小手表探索更多&#xff0c;高清双摄记录美好&#xff0c;离线定位随时掌握&#xff0c;绿色纯净守护成长&#xff0c;让孩子享受科技带来的安全与乐趣。

「新版」PyCharm 加载condav Environment / Conda executableis not found

在新版的 PyCharm 配置中&#xff0c;设置Conda环境不再与旧版本保持一致&#xff0c;对于新手而言可能不清楚如何加载&#xff0c;作者也是郁闷了好久&#xff0c;经过一顿输出发现需要通过加载conda配置&#xff0c;才调取conda虚拟环境&#xff0c;而不再是直接调取conda的虚…

做外贸如何找客户

做外贸是一项复杂而又具有挑战性的工作。在这个竞争激烈的市场中&#xff0c;找到合适的客户是成功的关键。下面是一些关于米贸搜如何找到外贸客户的经验分享。 第一&#xff0c;建立一个专业的网站。互联网已经成为了人们获取信息、进行交流的主要平台。因此&#xff0c;建立…

Linux--fork创建子进程详解

目录 一.初识fork函数 二.fork的返回值 三.fork原理 1.fork是如何创建子进程的&#xff1f; 2.为什么fork会有两个返回值&#xff1f; 3.为什么父进程的返回值是子进程的pid&#xff0c;子进程返回值是0&#xff1f; 4.fork之后&#xff0c;父子进程谁先运行&#xff1f;…

优先队列的时间复杂度

优先队列的时间复杂度&#xff1f; 这个问题主要分为两个部分&#xff1a;优先队列是什么&#xff1f;优先队列的时间复杂度是多少&#xff1f; 优先队列是什么&#xff1f; 优先队列&#xff0c;英文名&#xff1a;Priority Queue。顾名思义&#xff0c;优先队列是一种特殊…

【深度学习】强化学习(四)强化学习的值函数

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数6、值函数1. 状态值函数&#xff08;State Value Function&#xff09;a. 状态值函数的定义b. 贝尔曼方程&#xff08;Bellman Eq…

亚马逊鲲鹏系统可快速创建大量的买家账户

在数字时代的浪潮中&#xff0c;人们总是在寻找更便捷、高效的方式来完成各种任务&#xff0c;而亚马逊鲲鹏系统的出现&#xff0c;无疑为那些渴望拥有大批量买家号的人提供了一个全新的可能性。在这个系统中&#xff0c;注册买家号变得轻而易举&#xff0c;只需准备好一些必要…

WebRTC AEC回声消除算法拆解

WebRTC AEC算法流程分析——时延估计&#xff08;一&#xff09; 其实&#xff0c;网上有很多类似资料&#xff0c;各个大厂研发不同应用场景设备的音频工程师基本都对其进行了拆解&#xff0c;有些闪烁其词&#xff0c;有些却很深奥&#xff0c;笔者随着对WebRTC了解的深入&a…