golang 声音播放的初探 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jicg
V2EX    Go 编程语言

golang 声音播放的初探

  •  
  •   jicg 2019-01-20 21:46:32 +08:00 4693 次点击
    这是一个创建于 2463 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起因

    公司需要实现一个定期抓取分销系统数据并以声音播放的方式通知的 pc 端程序,本人对 golang 非常感兴趣,于是打算用 golang 来实现。


    探索

    1. 方案一 B 站视频

    1.1 方案说明:

    使用otominmp3 这个库来实现播放声音的功能。

    1.2 方案的不足

    当启动任务,每秒去播放声音的时候,时间一长就提示错误。于是,对声音播放不懂的我,到 github 提交了问题,目前没有解决方法。本人只好继续寻找其他的库,百度、谷歌啥的,发现了 portaudio 这个库(本人是菜鸟,对操作系统底层的 api 不懂,也不理解混音啥的算法,只能寻找其他的可代替的库)

    2. 方案二 B 站视频

    2.1 方案说明:

    使用portaudiominmp3 这个库来实现播放声音的功能。

    2.2 方案的不足

    portaudio 经过测试不会出现 oto 库的问题,可以使用。但是,如果播放一段文件大小为 7M 左右的 mp3 文件,发现内存有一百多 M。虽说,消息通知的语音都是 5k 左右的短语音,但是作为有强迫症的我,还是不满意。内存大的原因是 minmp3 这个库,解析 mp3 后,文件是放在内存里面的。而我发现 portaudio 这个库的示例代码里面有一个go-mpg123解析声音的库。

    3. 方案三 B 站视频

    3.1 方案说明:

    使用portaudiogo-mpg123这个库来实现播放声音的功能。

    3.2 方案不足

    使用的 portaudio 和 mpg123 已经完美的解决了公司的需求。但是 这两个库都是使用 cgo,所以在 wins 环境上开发需要搭建好开发环境。


    结束语

    1、golang 语言非常简单高效。 2、如有不对的地方,欢迎大神指正。 3、如果您想支持作者,可以到B 站上,给作者点个赞,关注作者。 4、简书原文地址:点我

    16 条回复    2019-01-24 09:41:27 +08:00
    ps1aniuge
        1
    ps1aniuge  
       2019-01-20 23:34:00 +08:00
    楼主想让电脑播放 “ txt 字符串”中的中文声音么?
    powershell 姥姥 语音
    https://www.cnblogs.com/piapia/p/8406170.html
    jicg
        2
    jicg  
    OP
       2019-01-20 23:38:45 +08:00 via iPhone
    @ps1aniuge 不是,是用 go 实现播放音乐
    jsyzdej
        3
    jsyzdej  
       2019-01-20 23:58:30 +08:00 via Android
    语音合成吗?
    jicg
        4
    jicg  
    OP
       2019-01-21 07:53:45 +08:00 via iPhone
    @jsyzdej 不是,就是简单播放音乐声音
    southwolf
        5
    southwolf  
       2019-01-21 09:53:50 +08:00
    直接调用 ffmpeg 不行?
    jicg
        6
    jicg  
    OP
       2019-01-21 10:19:51 +08:00 via iPhone
    @southwolf 这个好像是 c 不是 go
    southwolf
        7
    southwolf  
       2019-01-21 10:32:42 +08:00
    @jicg 搜一个 golang ffmpeg wrapper 就有了啊
    ysc3839
        8
    ysc3839  
       2019-01-21 13:00:41 +08:00 via Android
    通知的话使用系统提供的通知 API 会比较好。如果是 Win8 或 Win10 的话,可以使用 Git for Windows 提供的一个显示通知的命令行工具 wintoast.exe 。
    jicg
        9
    jicg  
    OP
       2019-01-21 14:10:56 +08:00
    @southwolf 这个框架也不错
    ntop
        11
    ntop  
       2019-01-21 14:22:09 +08:00
    我早前用 go 写过游戏引擎也做了一个纯 go 的音频引擎 - sine,支持大文件的流播放,小文件直接加载到内存播放,只有 windows 不支持。之前也调研过相关的音频库,Go 的实现基本上都是玩具,oto 也是玩具,目前看来最好的方案是依然采用程序的 C/C++ 音频库做 Cgo 封装,Soloud 的作者曾给我推荐过他的实现,封装起来应该还是蛮简单的,http://sol.gfxile.net/soloud/
    jicg
        12
    jicg  
    OP
       2019-01-21 14:25:03 +08:00
    @ntop
    ysc3839
        13
    ysc3839  
       2019-01-21 14:51:31 +08:00 via Android
    @jicg 应该不是,这只是 C++ 库,Git for Windows 有能直接用的命令行工具。
    jicg
        14
    jicg  
    OP
       2019-01-21 15:10:48 +08:00
    @ysc3839 哦哦,好的
    lozzow
        15
    lozzow  
       2019-01-24 00:10:44 +08:00 via iPhone
    刚好有这个需求,多谢
    jicg
        16
    jicg  
    OP
       2019-01-24 09:41:27 +08:00
    @lozzow oto 这个库,作者更新了,应该支持混音了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     877 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 22:27 PVG 06:27 LAX 15:27 JFK 18:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86