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 · 4310 次点击
    这是一个创建于 2162 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起因

    公司需要实现一个定期抓取分销系统数据并以声音播放的方式通知的 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   ·   实用小工具   ·   2588 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:16 · PVG 18:16 · LAX 02:16 · JFK 05:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.