伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

工業場景通話錄音:LuatOS 開源方案

青山老竹農 ? 來源:jf_82863998 ? 作者:jf_82863998 ? 2026-04-14 12:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

近期有較多用戶咨詢通話錄音功能的實現方案及相關參考案例。

AirUI 可視化方案目前仍在優化中,具備輕量化、低成本、高可靠性等特性,在工業場景具備一定應用價值。

針對用戶對通話錄音功能的需求,本文提供一套可直接落地的實現方案,支持自動接聽與自動錄音,適用于暫不使用可視化 UI 的開發場景參考。

一、方案功能

基于LuatOS開發,適配多種型號核心板,可實現低成本通話留痕,適用于客服系統、會議記錄、遠程問診、話務工單追溯等場景。
主要功能特色如下:

自動接聽: 來電響鈴2聲后自動接聽,無需手動操作。

自動錄音: 通話接通后自動開始錄音,對方掛斷后自動停止。

SD卡存儲: 錄音文件以PCM格式保存到SD卡,支持自動掛載和空間檢測。

數據優化: 只保存上行數據,避免下行數據造成的回聲問題。

跨模組兼容: Air780EHM、Air780EGH、Air780EHV、Air8000系列核心板,均可通過外掛音頻配件板和SD卡存儲配件板實現。

簡而言之:一套方案搞定多個硬件型號,極大提升開發效率。

二、主要硬件準備

方案一:Air8000/Air780EHV開發板

開發板提供了豐富的音頻接口資源,可通過開發板上的音頻接口進行連接和測試。

如Air8000/Air780EHV開發板:
wKgZO2ncfY6AYoGSABp3sKCAJA0239.png

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卡的/sd/record_call.pcm路徑下,可以通過讀卡器在電腦上查看;錄音文件為原始PCM格式,需要使用專用播放器(如Audacity )播放。
401NEW.png
402 播放器.png

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 開源
    +關注

    關注

    3

    文章

    4299

    瀏覽量

    46397
  • LuatOS
    +關注

    關注

    0

    文章

    168

    瀏覽量

    2738
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    WiFi 7 工業遠距離無線新標桿 ——Wallystech 全場景解決方案

    /DR5424 :工業級 AP / 路由,金屬機身,寬溫穩定,面向智能工廠、倉儲、高密接入場景。 DR9274 系列模塊 :QCN9274/QCN6274 方案,M.2 形態,便于嵌入式集成,支持
    發表于 04-14 11:30

    通話錄音功能實現:自動接聽 + 自動錄音開源方案

    AirUI 可視化方案仍在優化中,其輕量化、低成本、高可靠的特性在工業場景具備一定應用價值。針對用戶對通話錄音功能的需求,本文提供一套可直接落地的實現
    的頭像 發表于 04-13 13:36 ?204次閱讀
    <b class='flag-5'>通話錄音</b>功能實現:自動接聽 + 自動<b class='flag-5'>錄音</b><b class='flag-5'>開源</b><b class='flag-5'>方案</b>

    LuatOS中Modbus RTU通信開發指南

    ?在實際工業控制場景中,Modbus RTU常以主從結構實現多設備協同工作。LuatOS不僅支持標準串口通信,更提供了靈活的任務調度與內存管理機制,便于開發者在單一設備上實現主站或從站功能。本文將
    的頭像 發表于 02-03 19:34 ?736次閱讀
    <b class='flag-5'>LuatOS</b>中Modbus RTU通信開發指南

    LuatOS框架的使用(上)

    在資源受限的物聯網終端設備中,如何實現快速開發與穩定運行是關鍵挑戰。LuatOS框架通過將Lua語言與底層硬件抽象層深度融合,提供了一套簡潔高效的開發范式。本文將圍繞LuatOS框架的使用展開,從
    的頭像 發表于 01-27 19:38 ?310次閱讀
    <b class='flag-5'>LuatOS</b>框架的使用(上)

    LuatOS-Air轉LuatOS常見故障排查手冊

    LuatOS-Air腳本在LuatOS環境中運行失敗,問題往往集中在幾個關鍵模塊:任務調度、外設驅動、網絡配置和固件版本匹配。本文以故障排查的邏輯為主線,列出常見報錯現象、可能原因及快速修復方案
    的頭像 發表于 01-13 19:20 ?231次閱讀
    <b class='flag-5'>LuatOS</b>-Air轉<b class='flag-5'>LuatOS</b>常見故障排查手冊

    五大技術路徑,重塑格局:唯創電子錄音芯片方案引領智能錄音新紀元

    風雨聲中完整記錄自然之聲,抑或通過藍牙無損保存手機通話原音——這些對傳統錄音設備而言的奢望,正被廣州唯創電子五大專業錄音芯片方案變為現實。它們如同五把精準的手術刀,
    的頭像 發表于 12-26 09:10 ?651次閱讀
    五大技術路徑,重塑格局:唯創電子<b class='flag-5'>錄音</b>芯片<b class='flag-5'>方案</b>引領智能<b class='flag-5'>錄音</b>新紀元

    數字工牌是什么?數字工牌錄音方案設計

    數字工牌使用場景還是非常多的,主要使用場景集中在各種需要進行部門對接和客戶對接以及會議的場景當中。以展會為例,參展員工帶著數字工牌開啟錄音功能去和客戶溝通,在回到公司以后如果不
    的頭像 發表于 12-01 16:41 ?514次閱讀
    數字工牌是什么?數字工牌<b class='flag-5'>錄音</b><b class='flag-5'>方案</b>設計

    2025年新錄音芯片方案解決錄音設備三大難題

    ? 錄音筆市場三大核心痛點 在深入介紹我們的解決方案之前,讓我們先來看看當前錄音筆市場面臨的核心痛點。 1.錄音不清晰的煩惱:如果你坐在會議室后排,距離發言人有好幾米遠,傳統
    的頭像 發表于 11-13 16:55 ?1569次閱讀
    2025年新<b class='flag-5'>錄音</b>芯片<b class='flag-5'>方案</b>解決<b class='flag-5'>錄音</b>設備三大難題

    多封裝長錄音:WT2003H系列MP3錄音芯片滿足全場景音頻需求

    在音頻技術快速發展的今天,廣州唯創電子WT2003H系列以70秒錄音時長和三種封裝選擇,為智能設備提供專業的音頻解決方案01核心技術突破:70秒錄音時長的卓越表現1.1專業級錄音性能W
    的頭像 發表于 10-16 09:12 ?1035次閱讀
    多封裝長<b class='flag-5'>錄音</b>:WT2003H系列MP3<b class='flag-5'>錄音</b>芯片滿足全<b class='flag-5'>場景</b>音頻需求

    教程來啦!LuatOS中的消息通信機制詳解及其應用場景

    在資源受限的嵌入式環境中,LuatOS采用消息機制實現模塊間解耦與高效通信。通過預定義消息名稱(如“new_msg”),開發者可輕松構建響應式程序結構。接下來我們將深入剖析其實現原理與典型使用方法
    的頭像 發表于 09-26 18:59 ?529次閱讀
    教程來啦!<b class='flag-5'>LuatOS</b>中的消息通信機制詳解及其應用<b class='flag-5'>場景</b>

    廣州唯創電子錄音語音芯片IC:工作原理與應用場景全解析

    錄放音芯片解決方案,廣泛應用于智能家居、醫療設備、工業控制等領域。本文將深入解析其工作原理和典型應用場景。01錄音芯片的核心作用與技術價值錄音
    的頭像 發表于 09-24 09:39 ?939次閱讀
    廣州唯創電子<b class='flag-5'>錄音</b>語音芯片IC:工作原理與應用<b class='flag-5'>場景</b>全解析

    揭秘LuatOS Task:多任務管理的“智能中樞”

    Task任務作為LuatOS的核心組成部分,通過智能化的任務管理機制,實現任務的創建、調度與協同運行,讓復雜應用得以高效并行處理,滿足實時場景下的嚴苛需求。 sys核心庫是LuatOS運行框架庫
    的頭像 發表于 08-28 13:48 ?758次閱讀
    揭秘<b class='flag-5'>LuatOS</b> Task:多任務管理的“智能中樞”

    唯創錄音芯片五大技術方案,重塑智能錄音市場新格局:自動識別環境噪音、智能調節錄音參數、實現多路并

    2025,智能錄音市場正從基礎功能滿足轉向音質體驗升級。企業正面臨哪些技術選型難點?唯創知音一文為您解讀錄音芯片行業技術演進之路!三大訴求錄音市場正從功能滿足轉向品質升級傳統錄音設備音
    的頭像 發表于 08-16 12:03 ?1195次閱讀
    唯創<b class='flag-5'>錄音</b>芯片五大技術<b class='flag-5'>方案</b>,重塑智能<b class='flag-5'>錄音</b>市場新格局:自動識別環境噪音、智能調節<b class='flag-5'>錄音</b>參數、實現多路并

    多種錄音筆錄音芯片方案推薦

    多種錄音筆錄音芯片方案推薦 一、引言 隨著信息技術的飛速發展,錄音筆作為一種重要的音頻記錄設備,在會議記錄、采訪、學習等眾多場景中得到廣泛應用。其核心的
    的頭像 發表于 08-06 16:48 ?1439次閱讀

    芯資訊|廣州唯創電子語音芯片錄音采樣率解析:為多元場景打造聲音解決方案

    的采樣率設計可滿足不同場景下的音質與存儲需求。本文將重點解析其主流錄音芯片的采樣率特性及適用場景。一、WTR096芯片:經濟型錄音方案(8-
    的頭像 發表于 05-23 08:46 ?783次閱讀
    芯資訊|廣州唯創電子語音芯片<b class='flag-5'>錄音</b>采樣率解析:為多元<b class='flag-5'>場景</b>打造聲音解決<b class='flag-5'>方案</b>