思源有声书制作可行性

经过一段时间摸索,我发现思源比其他笔记软件都更适合我的编辑需求。

因为在学语言,在将教材转换成文档的过程中,对有声的需求颇高(而纯播放器中的音频字幕又不方便添加说明阐释),所以想知道在本身已有字幕文件的情况下,有没有快速制作有声文档的可能?

通过观察其他 quicker 动作,我学会了通过直接在每个块后添加 {: attrName=""} 批量设置属性。所以,我自己的思路:可以通过这种方式快速将字幕文档中的每句/段话绑定 "start" "end" "audiofileName" 属性,然后粘贴进入思源,再在所有这些句子前后加入教材其他解释说明,也许就可以达到有声文档的制作。

但是我不太懂编程,缺失了最关键一步:如何通过代码片段获取这些属性,并控制播放(双击块,或者通过代码在块前或块后添加某个 emoji 图标,点击图标播放块对应的属性中的 audiofileName 文件 播放 start 到 end 时间的内容)。

目前有搜索到一些插件可以通过自定义音频块时间属性,跳转对应位置,所以感觉我的需求在思源中也许也是有可能做到的,不过我的需求要多几点:

  • 希望能直接点击播放,而不只是跳转后再点击播放
  • 可以在 end 对应时间结束播放

有没有了解思源和 js 的大佬们能不吝赐教 🙏

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22773 引用 • 91425 回帖 • 2 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8321 引用 • 37917 回帖 • 158 关注
被采纳的回答
  • wilsons 3 1 赞同

    我说的添加 audio 标签不一定非要在 HTML 中显式的添加,用 js 隐式添加即可,但本质还是添加了 audio 标签。

    根据你的需求我实现了这个功能,不知道是否符合你的预期,仅供参考。

    首先,用 vscode 插件的 Markdown 源码中添加以下代码(思源中直接粘贴也可以,但 vscode 插件最保险,思源直接粘贴可能自定义属性被过滤,如果没过滤就可以,自己试试,我这边二者都可以)。

    demo1 ▶️
    {: id="20241126195837-wtsvkrg" custom-attrname="" custom-audiofilename="file:///yourpath.mp3" custom-end="40" custom-start="30"}
    
    demo2 ▶️
    {: id="20241126195837-wtsvkrg" custom-attrname="" custom-audiofilename="file:///yourpath.mp3" custom-end="30" custom-start="20"}
    

    然后,思源 js 代码片段中添加以下代码

    https://gitee.com/wish163/mysoft/blob/main/%E6%80%9D%E6%BA%90/%E6%80%9D%E6%BA%90%E9%80%9A%E8%BF%87%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7%E6%92%AD%E6%94%BE%E5%9D%97%E9%9F%B3%E9%A2%91.js

    const attrName = 'attrname';
    const audioFileAttrName = 'audiofilename';
    const startTimeAttrName = 'start';
    const endTimeAttrName = 'end';
    const playEmoji = '▶️';

    这个几个参数根据自己需要修改,要与 Markdown 中的保持一致。

    注意:js 代码里不需要带 custom-前缀,但 Markdown 代码里必须加 custom-前缀,注意属性使用小写,否则思源也会转换为小写。

    祝你好运 🍀

    效果:

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 怎么快速插入音频,并设置锚文本点击即播放? 可参考这个帖子,有了 audio 标签后,想怎么做,怎么做,比你说的方式简单一些

    1 回复
  • towfd

    这个帖子就是我之前发的,正是因为这个帖子的思路在我实际操作过程中发现很麻烦(需要切割句子音频,而且资源文件夹会积累非常多琐碎的文件),而且有时我需要播放整段,有时需要播放单句,这个也不好操作。所以我才换了种思路,这样就不会有那么多文件,而且可以直接给整段设置独立的时间,如果代码产出来了,其实整个工作流要简单很多。

    1 回复
  • 一样的

    只要设置 audio.currentTime = startTime; 就是开始时间

    播放到某时间点结束,可以这样

    // 监听时间更新事件,检查是否到达结束时间
        audio.addEventListener('timeupdate', function() {
            if (audio.currentTime >= endTime) {
                audio.pause(); // 停止播放
            }
        });
    

    然后调用播放的地方可以 playAudio(event, mp3, startTime, endTime)

    总之,写代码也是这个思路,要播放音频就得自己加个 audio 标签。至于触发方式我觉得可以在文字块前或后加个标志图标,比如声音图标,然后给这个图标添加事件触发播放。获取块属性可以用 api /api/attr/getBlockAttrs,但从你的需求来看,直接通过 dom 属性查找元素更符合需求,比如,document.querySelector('[custom-attrname="xxxx"]')。

    1 回复
  • towfd 3 评论

    一定要在文本里加 audio 标签吗?js 没法直接获取文件名播放吗?主要转变成 html 后编辑比较麻烦

    1 回复
    以我个人写 HTML 和 js 的经验来看还是用 audio 居多,就算不显示出来也是播放隐藏的 audio。不过确实没做过在思源里播放音频,可能有别的方法
    EmptyLight
    @EmptyLight 我主要不想把文本设置成 html 块,那直接每个文档插入音频(思源插入的音频本身就带 audio 标签),但是一个文档可能有多个音频,点击图标时播放定位块属性中的 audiofile 和对应时间可行吗?
    towfd
    @towfd 这个我确实没有尝试过,需要等其他人知道的来回答了
    EmptyLight
  • wilsons 3 1 赞同

    我说的添加 audio 标签不一定非要在 HTML 中显式的添加,用 js 隐式添加即可,但本质还是添加了 audio 标签。

    根据你的需求我实现了这个功能,不知道是否符合你的预期,仅供参考。

    首先,用 vscode 插件的 Markdown 源码中添加以下代码(思源中直接粘贴也可以,但 vscode 插件最保险,思源直接粘贴可能自定义属性被过滤,如果没过滤就可以,自己试试,我这边二者都可以)。

    demo1 ▶️
    {: id="20241126195837-wtsvkrg" custom-attrname="" custom-audiofilename="file:///yourpath.mp3" custom-end="40" custom-start="30"}
    
    demo2 ▶️
    {: id="20241126195837-wtsvkrg" custom-attrname="" custom-audiofilename="file:///yourpath.mp3" custom-end="30" custom-start="20"}
    

    然后,思源 js 代码片段中添加以下代码

    https://gitee.com/wish163/mysoft/blob/main/%E6%80%9D%E6%BA%90/%E6%80%9D%E6%BA%90%E9%80%9A%E8%BF%87%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7%E6%92%AD%E6%94%BE%E5%9D%97%E9%9F%B3%E9%A2%91.js

    const attrName = 'attrname';
    const audioFileAttrName = 'audiofilename';
    const startTimeAttrName = 'start';
    const endTimeAttrName = 'end';
    const playEmoji = '▶️';

    这个几个参数根据自己需要修改,要与 Markdown 中的保持一致。

    注意:js 代码里不需要带 custom-前缀,但 Markdown 代码里必须加 custom-前缀,注意属性使用小写,否则思源也会转换为小写。

    祝你好运 🍀

    效果:

    2 回复
  • towfd

    解答迅速,并且直接手把手喂饭,你就是互联网大善人! 思源有你是它的福气!🙇🙇🙇

    按照你给的代码,增加了一步字幕时间格式转换,可以完全正常地播放对应时段音频。

    唯一还有一点疑惑是,我不懂为什么要多自定义一个空的 attrname 属性,本来想删掉,开始只删了前面两处,但发现删了就没法正常使用了,搜索发现后面还有个回调函数也在用它,我看不懂这个空属性是用来干嘛的。

    1 回复
  • 谢谢!微薄之力,不敢当此殊荣哈。

    不懂为什么要多自定义一个空的 attrname 属性

    这个根据你之前的设定写的,这个作用是识别自定义块的标志,如果去掉,就无法识别到这个块是你自定义的了。

    不过,这个属性并不是必须的,如果想删除的话,可以把 observeAudioBlock 调用那里的 attrName 变量换成 audioFileAttrName 变量即可,这样就可以用音频文件属性查找自定义块了,如图所示

    image.png


    另外,早上我已经把代码更新到 0.0.2,这个版本增加了按钮鼠标悬停效果,增加了对自定义 emoji 的支持。

    自定义 Emoji 的使用方法:

    首先,Markdown 中添加如下代码,这里主要不同是:path/demo:这里,这是自定义 Emoji 的写法。

    demo3 :path/demo:
    {: id="20241127091438-k3nryro" custom-end="30" custom-start="20" custom-attrname="" custom-audiofilename="file://yourpath/xxxx.mp3"}
    

    然后在 js 中,playEmojiCustom 参数设置为 path/demo 即可。

    注意,自定义 Emoji 无需舔加图片扩展名。

    假设自定义表情路径是,data/emojis/demo/demo.png,则只需要填写:demo/demo 即可。

    自定义 Emoji 可以和普通 Emoji 共存,不使用该参数,填空即可。

    代码(同之前的是同一个网址):

    https://gitee.com/wish163/mysoft/blob/main/%E6%80%9D%E6%BA%90/%E6%80%9D%E6%BA%90%E9%80%9A%E8%BF%87%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7%E6%92%AD%E6%94%BE%E5%9D%97%E9%9F%B3%E9%A2%91.js

    1 回复
  • towfd

    真的非常感谢你 🙏 我在有声书的诉求上已经折腾了太久。epub 本身支持有声书,但是编辑太麻烦,完工后再修改也麻烦,做笔记也麻烦,支持的有声阅读软件也难找。纯播放器字幕显示也不适合阅读,你真的解决了我的大麻烦,帮助了我太多,真的太感谢你了!

    我选择思源不仅因为它本身(超级块非常方便排版,闪卡不会破坏原文档,不用导出 anki,且非常适合记忆有前后文的信息),还因为它的有解决个性化诉求的可能性和社区。虽然我自己技术小白,实现困难,但却总有人回复(而且两次回复我的都是你!)我觉得像你们本身懂技术、有自我解决问题的能力的人,每天却如此高强度刷社区,回复需要帮助的人,先不说技术付出,单单是愿意为陌生人付出宝贵的时间这本身就已经是可贵的善举了!思源有你们真的了不起!

    1 回复
  • 也谢谢你!你是一个懂得感恩的人,别的不说,光这一点所有努力都值得了!

    刚才好像在哪看到你说平板有问题来着,找不到了,我刚才在手机试了下,最新版手机上没问题,但移动端是没有鼠标悬停效果的。

    另外,要注意,确保资源文件放到了 assets 目录里或者是在线版的,如果音频文件是本地文件,在移动端是无法访问的。


    题外话,早上回复了一个问题, 希望思源笔记中能够点击单词进行播放单词的声音 - wilsons 的回帖 我现在突然觉得,这种方案或许是更方便的方案。

    你可以正常输入文本,只需要在需要播放音频的地方插入一个链接就可以了,然后后面我再改进下,比如可以设置 URL 参数 start=xx&end=xxx 等,然后就能达到你现在同样的效果了。

    如果批量插入,也可以 [文本](path/xxx.mp3?start=xx&end=xxx) 来插入链接就可以了,链接文本同样可以是 Emoji。

    目前仅仅是觉得可行,后续空了试试看,如果可行的话可以把这个链接方案完善下。

    1 回复
  • towfd 1 赞同

    是我修改属性名的问题,在各种复制粘贴中有的改了有的没改比较混乱,电脑可能因为缓存问题,能正常播放,导致我以为是移动端有啥问题。但是我自己发现问题改过来后已经能正常使用了,所以我随机又把回复删了。

    我昨晚也看了那个贴(因为和我的需求比较像),我上个贴也是说这种 [文本](path/xxx.mp3?start=xx&end=xxx) 格式插入后,点击不能直接播放,而是会直接跳转到资源页再点击才能播放,而直接按思源本身的方式插入音频,播放控件太大了,会影响页面布局排版。不过现在版本已经完全满足我目前的需求了,至于 srt 字幕文本到链接还是属性的批量格式替换,怎么转都差不多,不过链接的形式可能更好适配其他 md 笔记软件。

  • towfd

    大佬,有点不好意思,又跑来麻烦你,我想问问,就是如果想让每级标题前面(或后面)出现一个按钮,点击可以连续播放它下面的所有有声句,代码可以怎么修改?

    1 回复
    1 操作
    towfd 在 2024-11-29 17:20:39 更新了该回帖
  • 你这个按钮怎么加的? 具体什么按钮?有什么特征?

    1 回复
  • towfd

    就是和原来类似的加一个播放按钮,只是这个按钮是连续播放该级标题下的所有有声句(句子本身通常是连贯的,所以应该只需要读取第一个句子的 start 和最后一个句子的 end ,可能判定标题正文是在哪里结束的更麻烦点?因)。按钮具体什么样倒没有设定,也是 emoji 图标,和单句的图标有区别就行,你先随便设定一个图标就行。

    1 回复
  • 已按照你说的方式实现 https://gitee.com/wish163/mysoft/blob/main/%E6%80%9D%E6%BA%90/%E6%80%9D%E6%BA%90%E9%80%9A%E8%BF%87%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7%E6%92%AD%E6%94%BE%E5%9D%97%E9%9F%B3%E9%A2%91.js

    然后,修改下下面这个参数即可。

    // 标题播放按钮 Emoji,不使用该参数,填空即可
    //(该功能是通过获取标题下的所有音频的最小开始时间和最大结束时间实现的,因此不通用,如果你的音频不是连续播放的,勿用此功能)
    const playEmojiHead = ''; //⏩

    1 回复
  • towfd

    谢谢谢谢,太麻烦你了 🙇‍♀️🙇‍♀️🙇‍♀️

    由于字幕本身时间格式是这样式的 00:00:10,500,之前版本我就让 ai 增加了一步

    // 将SRT时间格式(例如 "00:00:10,500")转换为秒数
    function convertSrtTimeToSeconds(timeStr) {
        const [time, millis] = timeStr.split(',');
        const [hours, minutes, seconds] = time.split(':').map(Number);
        return hours * 3600 + minutes * 60 + seconds + millis / 1000;
    }
    
    observeAudioElements('custom-' + attrName.replace(/^custom\-/i,''), block => {
        // ......
      
        audioPlayBtn?.addEventListener('click', (event) => {
            const file = block.getAttribute('custom-' + audioFileAttrName.replace(/^custom\-/i,''));
            let startTime = block.getAttribute('custom-' + startTimeAttrName.replace(/^custom\-/i,''));
            let endTime = block.getAttribute('custom-' + endTimeAttrName.replace(/^custom\-/i,''));
      
            // 将SRT时间格式转换为秒数
            startTime = convertSrtTimeToSeconds(startTime);
            endTime = convertSrtTimeToSeconds(endTime);
      
    

    但新增加的代码,我再让 ai 修改,它只修改了 onHeadPlayEmojiAddition(head) 中的两处 starts.push(convertSrtTimeToSeconds(start));starts.push(convertSrtTimeToSeconds(start));,但尝试点击却并没有播放成功,感觉似乎并没有修改完全,但代码里面已经出现了太多 start 和 end,我的脑子也是一团浆糊,也不知道哪些该修改哪些不该。

    另外,这个标题按钮似乎只能支持原生 emoji,我自己保存的图标无论是以文件名的形式'playall',还是以在思源中直接复制图标后生成的格式 ':playall:' 似乎都不起作用。因为我测试过程中,原生 emoji 虽然可能因为前面修改的不完善导致不能播放,但是会出现悬浮手指,而自定义的 emoji 则不会出现。不过这点不修改也不会影响啥,无论什么形式的 emoji 只要能正常播放就行。已经太麻烦你了。

    1 回复
  • wilsons 1 1 赞同

    0.0.4 兼容时间格式,标题 Emoji 兼容自定义 Emoji

    https://gitee.com/wish163/mysoft/blob/main/%E6%80%9D%E6%BA%90/%E6%80%9D%E6%BA%90%E9%80%9A%E8%BF%87%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7%E6%92%AD%E6%94%BE%E5%9D%97%E9%9F%B3%E9%A2%91.js

    新增参数

    // 标题播放按钮自定义 Emoji,使用方式同 playEmojiCustom 参数(二者可共存),不使用该参数,填空即可
    const playEmojiCustomHead = '';

    1 回复
  • towfd

    可以正常播放了,但是我好像发现了一点 bug。

    1. 每个块如果只要有了自定义播放按钮,在这个块的任何地方输入或删改任何内容都会将图标吞没。
    2. 原生 emoji,在我的尝试中不会被吞没,但是输入内容后光标会跳回行首,并且会丧失播放功能,但仍然会出现悬停手指。
    3. 无论是自定义还是原生,重启思源或刷新页面后都会导致原图标丧失播放功能,也仍然会出现悬停手指。

    这一点导致我最开始贴入代码时,反复重启思源(之前因为缓存导致了错误,所以我后面贴入代码都重启了)却并没能正常播放,然后我去对照了你增改的地方,发现似乎也是在那几处增加了 convertSrtTimeToSeconds,我本来仍然在想难道仍然是因为有什么地方格式没改完善?但心想你应该对自己代码很了解,如果你和 ai 都只选择了修改这几处,那应该更可能是其他地方有问题。

    于是我又开始尝试,发现我新增加的按钮就能正常播放,但因为按钮后习惯键入空格,以及在换行时,都出现了按钮被吞没的情况,我就又比较了自定义和原生、标题和自带属性的块的不同情况。自定义和原生情况如上,自带属性的块也会出现上述按钮被吞没或光标跳转行首的情况,但不会丧失播放功能(可能因为它的播放机制更简单、更直接?),所以我前几天没发现这个问题,因为光标跳一下我没当回事,光标丢失我也自己补上了,知道今天的重启后标题图标丧失播放功能才提醒我。

    1 回复
  • wilsons 1 1 赞同

    这是因思源块内无法添加自定义元素和自定义属性导致的,详见 Issue #13325 · siyuan-note/siyuan

    又加上 emoji 是字符不好获取点击事件,所以现在放弃 emoji 方案,仅支持自定义 emoji 方案

    新代码如下:

    https://gitee.com/wish163/mysoft/blob/main/%E6%80%9D%E6%BA%90/%E6%80%9D%E6%BA%90%E9%80%9A%E8%BF%87%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7%E6%92%AD%E6%94%BE%E5%9D%97%E9%9F%B3%E9%A2%91.js

    注意:如果同一个标题或块中有多个相同播放按钮,仅第一个添加的生效。

    1 回复
  • towfd 4 评论

    功能一切正常!你太厉害了!感谢你这些天在这个问题上花费了这么多时间精力。这几天眼见着代码越来越长,我也越来越不好意思一次又一次地叨扰你,实在太感谢你了!

    不客气,没问题就好。
    wilsons
    @wilsons 我发现排版时使用了超级块的话,当下可以播放,但当刷新后或重启后,按钮又会丧失播放功能(有手指出现),这是因为上面那个 issue 中所说的 span 不能嵌套吗?超级块在思源里也是 span 吗?
    towfd
    @towfd 这是因为思源加载时是以块为单位加载的,使用了超级块后,音频块就变成了嵌套子块,我在 0.0.6 版本做了嵌套块的兼容,你更新下代码试试。
    wilsons 1 1 赞同
    @wilsons 可以了,谢谢你 🙇
    towfd
请输入回帖内容 ...

推荐标签 标签

  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 49 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 358 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 589 关注
  • 导航

    各种网址链接、内容导航。

    41 引用 • 175 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 7 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    26 引用 • 196 回帖 • 19 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 3 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    27 引用 • 85 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 626 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    135 引用 • 190 回帖 • 1 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 1 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 324 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • 倾城之链
    23 引用 • 66 回帖 • 136 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    171 引用 • 512 回帖
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 142 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    287 引用 • 4484 回帖 • 664 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1328 回帖
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 767 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 3 关注