0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通话录音功能实现:自动接听 + 自动录音开源方案

合宙LuatOS 2026-04-13 13:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

AirUI 可视化方案仍在优化中,其轻量化、低成本、高可靠的特性在工业场景具备一定应用价值。针对用户对通话录音功能的需求,本文提供一套可直接落地的实现方案,支持自动接听与自动录音,适用于暂无需可视化 UI 的场景参考。

一、方案功能
基于LuatOS开发,适配多种型号核心板,可实现低成本通话留痕,适用于客服系统、会议记录、远程问诊、话务工单追溯等场景。

主要功能特色如下:

自动接听: 来电响铃2声后自动接听,无需手动操作。

自动录音: 通话接通后自动开始录音,对方挂断后自动停止。

SD卡存储: 录音文件以PCM格式保存到SD卡,支持自动挂载和空间检测。

数据优化: 只保存上行数据,避免下行数据造成的回声问题。

跨模组兼容: Air780EHM、Air780EGH、Air780EHV、Air8000系列核心板,均可通过外挂音频配件板和SD卡存储配件板实现。

简而言之:一套方案搞定多个硬件型号,极大提升开发效率。

二、主要硬件准备
方案一:Air8000/Air780EHV开发板

开发板提供了丰富的音频接口资源,可通过开发板上的音频接口进行连接和测试。

如Air8000/Air780EHV开发板:

wKgZO2ncfY6AYoGSABp3sKCAJA0239.png

方案二:核心板+配件板

如果没有Air780EHV和Air8000系列Turnkey开发板,那么可使用Air780EHM、Air780EGH、Air780EHV、Air8000系列核心板,通过外挂音频配件板和存储配件板来实现通话录音功能。

AirAUDIO_1010音频配件板: 负责音频输入输出;

AirMICROSD_1010存储配件板: 提供SD卡存储功能。

连接小贴士: 如果搭配AirAUDIO_1010扩展板测试,需将扩展板中PA开关拨到OFF,让软件控制PA,避免pop音。

本文以Air780EGH为例:

接线方式参照下方图表对应连接(注意不同型号核心板具体引脚号差异):

wKgZO2ncfcaADN0oABUG9Ev8m6w734.png

wKgZPGncfeCAfg0dAAUthHXjVAo797.png

三、开源示例与教程
基于LuatOS开发的通话录音示例已上传Gitee开源仓库,即便是新接触LuatOS开发的朋友,也可以根据合宙资料中心提供配套实操教程快速上手。

核心功能模块包括SD卡挂载、通话状态机、录音数据回调等,完整示例代码详见源码仓库最新文件。

--[[ 录音功能特性: - 录音文件保存为PCM格式:/sd/record_call.pcm - 只保存上行数据(包含本地声音和网络回声) - 下行数据自动跳过,避免重复存储 - 支持SD卡自动挂载和空间检测 -- ====================== 录音功能 ====================== -- 创建音频数据缓冲区 local up1 = zbuff.create(BUFFER_SIZE,0) -- 上行数据保存区1 local up2 = zbuff.create(BUFFER_SIZE,0) -- 上行数据保存区2 local down1 = zbuff.create(BUFFER_SIZE,0) -- 下行数据保存区1 local down2 = zbuff.create(BUFFER_SIZE,0) -- 下行数据保存区2 -- 打开录音文件 local function open_record_file() -- 先挂载SD卡 if not mount_sd_card() then log.error("录音文件", "SD卡挂载失败,无法进行录音") return false end log.info("录音文件", "SD卡挂载成功,录音文件将保存到SD卡") -- 关闭已打开的文件 if record_file then record_file:close() record_file = nil end -- 删除旧录音文件 if io.exists(RECORD_FILE_PATH) then os.remove(RECORD_FILE_PATH) log.info("录音文件", "删除旧录音文件:", RECORD_FILE_PATH) end -- 创建录音文件 record_file = io.open(RECORD_FILE_PATH, "wb") if record_file then log.info("录音文件", "创建录音文件成功:", RECORD_FILE_PATH) record_start_time = mcu.ticks() is_recording_to_file = true return true else log.error("录音文件", "创建录音文件失败:", RECORD_FILE_PATH) return false end end -- 关闭录音文件 local function close_record_file() if record_file then record_file:close() record_file = nil local file_size = io.fileSize(RECORD_FILE_PATH) record_duration = (mcu.ticks() - record_start_time) / 1000 -- 转换为秒 log.info("录音文件", "录音完成", "文件大小:", file_size, "字节", "录音时长:", string.format("%.1f", record_duration), "秒", "路径:", RECORD_FILE_PATH) is_recording_to_file = false record_start_time = 0 record_duration = 0 end end -- 写入录音数据到文件 local function write_record_data(buff, is_downlink) if not record_file or not is_recording_to_file then return false end -- 保存数据 if not is_downlink then local data_size = buff:used() if data_size > 0 then local start_time = mcu.ticks() -- 写入数据到文件 record_file:write(buff:query()) local end_time = mcu.ticks() local write_time = end_time - start_time local write_speed = data_size / (write_time / 1000) -- 字节/秒 log.info("录音写入", "数据大小:", data_size, "字节,", "写入耗时:", string.format("%.2f", write_time), "ms,", "写入速度:", string.format("%.2f", write_speed / 1024), "KB/s") return true end else -- 下行数据不保存,只记录日志 -- 写入下行数据会导致文件内有回声 local data_size = buff:used() if data_size > 0 then log.info("录音写入", "下行数据跳过", "数据大小:", data_size, "字节") end end return false end -- 音频数据回调函数 local function recordCallback(is_dl, point) if is_dl then log.info("录音", "下行数据,位于缓存", point+1, "缓存1数据量", down1:used(), "缓存2数据量", down2:used()) -- 处理下行数据 if point == 0 then write_record_data(down1, true) down1:del() -- 清空缓冲区 else write_record_data(down2, true) down2:del() -- 清空缓冲区 end else log.info("录音", "上行数据,位于缓存", point+1, "缓存1数据量", up1:used(), "缓存2数据量", up2:used()) -- 处理上行数据 if point == 0 then write_record_data(up1, false) up1:del() -- 清空缓冲区 else write_record_data(up2, false) up2:del() -- 清空缓冲区 end end log.info("通话质量", cc.quality()) end -- 启用通话录音 local function enableRecording() cc.record(true, up1, up2, down1, down2) cc.on("record", recordCallback) log.info("cc_app", "通话录音已启用") end -- 开始通话录音到文件 local function start_call_recording() if open_record_file() then log.info("通话录音", "开始录音到文件:", RECORD_FILE_PATH) return true else log.error("通话录音", "无法开始录音到文件,请检查SD卡") return false end end -- 停止通话录音到文件 local function stop_call_recording() close_record_file() log.info("通话录音", "停止录音到文件") end -- 获取所有缓冲区 local function getRecordingBuffers() return { up1 = up1, up2 = up2, down1 = down1, down2 = down2 } end -- 获取录音文件信息 local function get_record_file_info() if io.exists(RECORD_FILE_PATH) then local file_size = io.fileSize(RECORD_FILE_PATH) return { path = RECORD_FILE_PATH, size = file_size, duration = record_duration, exists = true } else return { path = RECORD_FILE_PATH, size = 0, duration = 0, exists = false } end end -- 呼入自动接听,等待对方挂断 local function handle_scenario(status) if status == "INCOMINGCALL" then -- 获取来电号码 caller_number = cc.lastNum() or "未知号码" call_counter = call_counter + 1 log.info("收到来电,号码:", caller_number, "响铃次数:", call_counter) -- 响铃2声后自动接听 if call_counter >= 2 then log.info("自动接听来电") cc.accept(0) call_counter = 0 -- 重置计数器 end elseif status == "SPEECH_START" then -- 语音通话真正开始 log.info("电话已接通,电话号码:", caller_number) -- 开始通话录音到文件 start_call_recording() elseif status == "DISCONNECTED" then -- 对方挂断通话 log.info("通话结束对方挂断") -- 停止通话录音到文件 stop_call_recording() call_counter = 0 -- 重置计数器 end end -- ====================== 主事件处理器 ====================== sys.subscribe("CC_IND", function(status) log.info("CC状态", status) handle_scenario(status) -- 需要处理的通用状态 if status == "READY" then sys.publish("CC_READY") -- 发布系统就绪事件 elseif status == "HANGUP_CALL_DONE" or status == "MAKE_CALL_FAILED" or status == "DISCONNECTED" then exaudio.pm(audio.SHUTDOWN) --主动进入低功耗模式 end end) -- ====================== 电话系统初始化 ====================== local function init_cc() -- 先尝试挂载SD卡 mount_sd_card() -- 初始化音频设备 audio_drv.initAudioDevice() -- 等待电话系统就绪 sys.waitUntil("CC_READY") -- 初始化电话功能 cc.init(audio_drv.getMultimediaId()) -- 启用通话录音(录音功能在cc_app中) enableRecording() log.info("cc_app", "电话系统初始化完成") end -- 启动初始化任务 sys.taskInit(init_cc) 四、使用注意事项 必须插入SD卡才能使用录音功能,因为录音文件较大无法存入内存;缓冲区大小必须是640的倍数,否则可能导致录音异常。

四、使用注意事项

必须插入SD卡才能使用录音功能,因为录音文件较大无法存入内存;缓冲区大小必须是640的倍数,否则可能导致录音异常。

录音文件保存在SD卡的/sd/record_call.pcm路径下,可以通过读卡器在电脑上查看;录音文件为原始PCM格式,需要使用专用播放器(如Audacity)播放。

wKgZO2ncfw6APds2AADiMWJCQxw308.png


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Lua
    Lua
    +关注

    关注

    0

    文章

    90

    浏览量

    11507
  • 通话录音
    +关注

    关注

    0

    文章

    3

    浏览量

    1125
  • 物联网开发
    +关注

    关注

    0

    文章

    12

    浏览量

    1936
  • LuatOS
    +关注

    关注

    0

    文章

    169

    浏览量

    2745
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    解决苹果手机通话不能录音的问题

    的iphone7,也是一样没有通话录音功能的。为这个问题,也在很多地方找过解决办法,比较常见的的一种解决办法,就是第三方录音软件。这样的软件大部分是有一个时间的免费试用时间,比如可以免费试录5分钟
    发表于 11-08 16:27

    iPhone6手机通话时怎么录音?,完美攻略get起来吧~

    通话录音便是其中的一项,通话录音功能对于一些人的帮助还是蛮大的,毕竟在当下社会风气下,有很多东西都是需要证据的,而这项功能无疑对于一些人来说还是有很大的需求的,并且是保护自身的一种方
    发表于 12-05 19:17

    8路电话录音

    多路通话录音(单机多达128路); 录音任一路的实时通话情况; 在本机和网络查询、录音任一个录音; 系统24小时不间断
    发表于 06-05 10:15 640次阅读

    8路电话录音

    主要功能 多路通话录音(单机多达128路); 录音任一路的实时通话情况; 在本机和网络查询、录音任一个
    发表于 06-12 15:20 904次阅读

    电话录音,电话录音系统,电话录音卡,电话录音

    主要功能 多路通话录音(单台电脑可组建1~128路电话录音系统); 录音任一路的实时通话情况; 在本机和网络查询、
    发表于 07-30 10:05 767次阅读

    录音电话,录音电话是什么意思

    录音电话,录音电话是什么意思 录音电话指具有能自动应答和对通话内容进行录音
    发表于 03-06 17:31 2262次阅读

    做好通话录音设备,要考量这几个方面

      在给许多客服打电话的时候,你肯定会听到以下对白,“为了保障你的利益,你的通话可能会被录音”。但是你知道是怎么录音的吗?用一支录音笔放在电话机旁边?用以前老港片里面用的那种磁带式模拟
    发表于 05-27 16:36 1989次阅读

    电脑版本的通话录音软件有哪些

        随着时代的进步,人民生活水平的提升,人们的通讯安全意识也在不断的提高。手机上下载了各种录音软件、管家软件。那么电脑版本的通话录音软件有哪些呢?今天就为大家推荐一款安全性高的通话录音软件
    发表于 07-09 13:34 1195次阅读

    谷歌Android Pie系统正式推出,除了添加一些新特性外通话录音功能遭遇封杀

    近日谷歌公司正式向外界推出Android Pie正式系统版本,这次更新又添加了一些新特性。新功能包含全新的导航UI、游戏保护、全局黑夜模式等,不过令人意外的是据外媒报道今年2月份添加的通话录音功能被完全阻止,对众多用户来言并不能
    发表于 08-17 16:25 1282次阅读

    ios15支持通话录音功能吗 苹果如何设置通话录音

    ios15支持通话录音功能吗?虽然苹果公司已经发布了ios15系统,想必大家应该还不知道如何设置ios15系统通话录音功能,下面就由小编简单介绍一下!
    的头像 发表于 06-11 09:59 2.8w次阅读

    ios15出通话录音,ios15有通话录音

    由于苹果手机对隐私保护看的很重要,所以就一直没有通话录音功能。随着这次的ios15操作系统的发布,果粉们比较关注的问题就是苹果手机能否录音。据小编关注的发布会来看,ios15系统包含了多项新
    的头像 发表于 06-11 11:17 1.5w次阅读

    电销自动外呼系统的主要功能都有哪些

    自动外呼系统主要功能: 1、自动外呼功能 可新建外呼任务,批量导入电话号码,不用手动拨出,系统自动进行外呼,提高外呼效率。 2、
    发表于 07-16 17:07 2566次阅读

    苹果13有通话录音功能

    iPhone13即将发布,也曝光了各种外观、配置参数以及功能,网友们都很关注iPhone13有没有通话录音的这个功能,但是到目前为止还没有看到有消息流出。由于iPhone对个人隐私权的看重,或许iPhone13依然不支持
    的头像 发表于 09-10 10:50 4.8w次阅读

    【苹果神器来袭】录音宝,让你的通话录音so easy!

    中,比如商务沟通、重要会议记录、与家人朋友的珍贵对话等,通话录音往往有着至关重要的作用。为了满足广大苹果用户对通话录音这一功能的强烈需求;唯创知音公司精心研发并推
    的头像 发表于 07-27 08:38 1720次阅读
    【苹果神器来袭】<b class='flag-5'>录音</b>宝,让你的<b class='flag-5'>通话录音</b>so easy!

    工业场景通话录音:LuatOS 开源方案

    目前AirUI可视化方案仍在优化阶段,其轻量化、低成本、高可靠的特点已逐步显现,在工业场景中具有一定的应用潜力。 考虑到大家对通话录音功能的迫切需求,今天就为大家分享一套可直接实操的方案
    的头像 发表于 04-14 12:36 59次阅读
    工业场景<b class='flag-5'>通话录音</b>:LuatOS <b class='flag-5'>开源</b><b class='flag-5'>方案</b>