当前位置:   article > 正文

瑞芯微rk3568移植openbmc(六)----关于novnc和vnc音频传输_rk3588拉取视频到ikvm openbmc

rk3588拉取视频到ikvm openbmc

         解决了vnc的H264/H265编码问题后,视频帧率上去了,带宽占用降低了,但随之而来的问题是声音呢?音频问题怎么解决?VNC协议是没有定义音频的,只传输视频不传输音频,既然H264的编码我们可以修改协议添加上去,那是不是可以修改VNC的协议把音频也添加上去呢?带着这个疑问重新研究了下VNC相关的信息,下面就目前研究的成果做一个简介

        首先来查看现有的VNC协议的定义,可以发现其实VNC已经被qemu做了扩展,qemu里面已经可以带音频传输【最新的qemu 7.x】:

 https://github.com/rfbproto/rfbproto/blob/master/rfbproto.rst#qemu-audio-server-message

https://github.com/rfbproto/rfbproto/blob/master/rfbproto.rst#qemu-audio-server-message

        而配套的qemu vnc server的客户端有没有呢?确实是有的,第三方个人修改的TigerVNC版本:

https://github.com/mkupchik/tigervnc

       那是否可以基于qemu定义的音频传输方式来自己实现一个vnc server呢,抱着这个疑问继续研究:

      分析TigerVNC中的代码实现同时参考上述rfb协议文档中qemu定义的audio信息,梳理归纳如下:

server和client交互:

  1. client发送rfbSetEncodings (2)类型命令获取当前支持的编码方式,同时探测是否支持audio命令:-259
  2. server收到rfbSetEncodings,如果支持qemu audio,则回复client rfbFramebufferUpdate(0)命令,Encoding设置为rfbEncodingQemuAudio(-259)
  3. client收到rfbFramebufferUpdate,判断Encoding为rfbEncodingQemuAudio(-259)则初始化音频相关的配置。
  4. client初始化完音频配置后,向server发送rfbQemuEvent(255)命令,subMsgType设定为qemuAudio(1),operation设定为rfbQemuSetAudioFormat(3),让server对audio进行初始化;之后再次发送一个rfbQemuEvent(255)命令,operation设定为rfbQemuEnableAudio(0),通知server可以开启音频了。
  5. srver收到rfbQemuEnableAudio(0)后向client回复rfbQemuEvent(255)命令,operation设定为rfbQemuAudioStart(0),然后进入按client发送的音频配置进行初始化并进入采集操作。
  6. server进入持续的音频采集发送程序,持续向client发送rfbQemuEvent(255)命令,operation设定为rfbQemuAudioData(2)
  7. 当client想禁止音频时,发送一个rfbQemuEvent(255)命令,operation设定为rfbQemuDisableAudio(1),通知server关闭音频
  8. server收到rfbQemuEnableAudio(0)后向client回复rfbQemuEvent(255)命令,operation设定为rfbQemuAudioStop(1),然后停止音频采集发送。

        Server和Client的交互分析完了,新问题随之来了:去哪里获取Host的音频数据呢?

       其实这个问题很简单:USB Gadget!既然USB Gadget可以模拟成鼠标、键盘、U盘,那当然也可以模拟成声卡!并且linux驱动的gadget模型中已经原生支持UAC1和UAC2的模拟了,UAC2仅在win10及以上版本才自带驱动,在win7、win8中没有驱动,因此模拟UAC1相对更适合一些。         如何配置usb gadget模拟声卡这里就不多介绍了,网上有很多相关资料,感兴趣的朋友可以自己百度一下~

       现在声卡有了,下面就是如何获取Host发送过来的音频数据了:

       这个问题也不复杂,当前已经有很多很多第三方工具支持音频采集的了,如ffmpeg、gstreamer、arecord等等,并且都提供了相应的lib库可以直接调用,完全可以不用去关心底层如何实现的音频采集。参考了以下作者的blog,选择了最简单的asla-lib库来进行开发。

https://blog.csdn.net/pk296256948/article/details/107013912/

https://blog.csdn.net/qq_39678541/article/details/125204110

       接下来就是对libvncserver和obmc-ikvm的代码修改了,这两个修改没有太大难度,直接按上诉server和client交互流程实现即可,实际效果如下:

       TigerVNC客户端的适配解决后,那novnc是否也有解决方案呢?

答案是肯定的!github一顿猛攻后,得到了最佳输出:

https://github.com/pkjy/pcm-player

         将pcm-player的代码移植到novnc中,并添加和server相关的audio交互命令,得到效果如下:

         将上诉的修改合入到openbmc中,从下面视频可以看到即便是添加了音频,在H264编码的加持下,带宽最多占用12Mbps,少的时候仅有8~10Mbps,效果相当不错~

        实测不管是novnc还是TigerVNC客户端或者openbmc kvm上,音频效果都还是比较不错的,播放电影声音和人物口型几乎一致,拖动播放条声音也比较丝滑,即便单板环境布置在远端,通过VPN连接网络进行测试,看视频也完全没有问题。音频带宽占用也很低,仅比单视频时多1Mbps左右。

        但相对也存在缺点由于音频流和视频流是单独发送的,vnc中音视频之间没有一个同步操作,在kvm长时间开启时,音频会逐渐逐渐变的与视频不同步,时间越长、网络越差,音视频不同步越明显。但只要关闭kvm重新再打开,音视频又可以立刻同步上了

      好了,vnc的音视频传输就先到此为止吧,后续有其他需求时再来做进一步研究~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/405489
推荐阅读
相关标签
  

闽ICP备14008679号