天意无罪 发表于 2022-11-25 22:41

【行空板 Python编程学习主控板】评测八、使用unihiker库自带的Audio类播放音乐

<div class='showpostmsg'> 本帖最后由 天意无罪 于 2022-11-25 23:25 编辑

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为后面测评的主要内容是有关AI语音识别和图像识别的内容,对于语音识别,行空板板载了麦克风,所以只需要购买一个USB免驱小音箱或者USB免驱声卡。对于图像识别,需要购买一个USB免驱摄像头。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于家里有好几个小音箱,所以选择购买一个USB免驱声卡,最终选的绿联的一款USB免驱声卡。</p>

<p align="center"></p>

<p style="text-align: center;">&nbsp;图1</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了避免因兼容性问题带来不必要的折腾,USB免驱摄像头在DFRobot官方商城购买的(PS:怎么感觉有点小贵啊)。</p>

<p align="center"></p>

<p style="text-align: center;">&nbsp;图2</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;周一购买的声卡和摄像头就到了,由于工作比较忙,包裹拿回来后就放在那里没有时间把玩。今天下班回家吃完饭,才想起拆包裹。明天周末了,终于有点时间继续玩行空板了。</p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;由于行空板自带的unihiker库中有Audio类,可以实现音频的录音机播放,于是想着先写个简单的音频播放程序,先试试购买的USB免驱声卡是否可以使用。</p>

<p><b>&nbsp; &nbsp; &nbsp; &nbsp; (一)硬件资源</b></p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;需要准备的硬件设备包括:行空板、USB免驱声卡、支持3.5mm输入的飞利浦蓝牙小音箱;</p>

<p><b>&nbsp; &nbsp; &nbsp; &nbsp; (二)方案设计</b></p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;由于是使用unihiker自带的库,所以打算设计一个最简单的播放器,而不是诸如用Pygame库设计一个功能完整的音乐播放器。</p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<b>设计需求:</b></p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; (1)显示屏需要放一张背景图片作为底色;</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; (2)显示屏上设置4个按钮,分别为:播放、暂停、继续、停止,分别对于unihiker库中Audio类的非阻塞播放方式的4个类;</p>

<p align="center"></p>

<p style="text-align: center;">&nbsp;图3</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; (3)不支持音频文件选择,直接播放指定音频文件名称。</p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<b>背景图片及音乐选择:</b></p>

<p><b>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;</b>关于背景图片选择,由于是播放音乐,所以最好是放一张歌手的照片,于是我很快想到了一个喜欢的歌手:周慧敏,她是无数祖孙三代人心中的女神。之前在网易云音乐看到过一位网友的评论:她(周慧敏)是唯一一个,我爷爷想娶的女人、我爸爸想娶的女人、我也想娶的女人;&nbsp;</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p style="text-align: center;">&nbsp;图4</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p class="imagemiddle" style="text-align: center;">图5</p>

<p align="center"><v:shape id="图片_x0020_64" type="#_x0000_t75"> <w:wrap type="none"> <w:anchorlock> </w:anchorlock></w:wrap></v:shape></p>

<p align="center"><v:shape id="图片_x0020_65" type="#_x0000_t75"> <w:wrap type="none"> <w:anchorlock> </w:anchorlock></w:wrap></v:shape></p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;至于歌曲名称也有答案了,那就是&ldquo;痴心换情深&rdquo;。</p>

<p><b>&nbsp; &nbsp; &nbsp; &nbsp; (三)软件设计</b></p>

<p align="left">&nbsp; &nbsp; &nbsp; &nbsp; 使用Mind+代码编程模式,完整Python代码如下:</p>

<pre>
<code class="language-python">#-*- coding: UTF-8 -*-
# MindPlus
# Python
from unihiker import Audio
from unihiker import GUI
import time

# 事件回调函数
def bf_button_click():
    thread1=u_gui.start_thread(u_thread1_function)
def u_thread1_function():
    u_audio.start_play("痴心换情深.mp3")
    txt=u_gui.draw_text(text="周慧敏—痴心换情深",x=30,y=240,font_size=15, color="#00FF00")
def zt_button_click():
    thread2=u_gui.start_thread(u_thread2_function)
def u_thread2_function():
    u_audio.pause_play()
    bj=u_gui.draw_image(image="zhm1.jpg",x=0,y=0)
    txt=u_gui.draw_text(text="暂停播放",x=80,y=240,font_size=15, color="#00FF00")
def jx_button_click():
    thread3=u_gui.start_thread(u_thread3_function)
def u_thread3_function():
    bj=u_gui.draw_image(image="zhm1.jpg",x=0,y=0)
    txt=u_gui.draw_text(text="继续播放",x=80,y=240,font_size=15, color="#00FF00")
    time.sleep(1)
    bj=u_gui.draw_image(image="zhm1.jpg",x=0,y=0)
    u_audio.resume_play()
    txt=u_gui.draw_text(text="周慧敏—痴心换情深",x=30,y=240,font_size=15, color="#00FF00")
def tz_button_click():
    thread4=u_gui.start_thread(u_thread4_function)
def u_thread4_function():
    u_audio.stop_play()
    bj=u_gui.draw_image(image="zhm1.jpg",x=0,y=0)

u_gui=GUI()
u_audio = Audio()
bj=u_gui.draw_image(image="zhm1.jpg",x=0,y=0)
bfan=u_gui.add_button(text="播放",x=12,y=280,w=45,h=30,onclick=bf_button_click)
ztan=u_gui.add_button(text="暂停",x=69,y=280,w=45,h=30,onclick=zt_button_click)
jxan=u_gui.add_button(text="继续",x=126,y=280,w=45,h=30,onclick=jx_button_click)
tzan=u_gui.add_button(text="停止",x=183,y=280,w=45,h=30,onclick=tz_button_click)

while True:
    pass
</code></pre>

<p align="left">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;运行代码后,行空板显示屏会显示如下界面。</p>

<p align="center"></p>

<p style="text-align: center;">&nbsp;图6</p>

<p><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;调试过程遇到的2点问题及解决方案分享一下:</b></p>

<p><b>&nbsp; &nbsp; &nbsp; &nbsp; (1)重刷显示问题</b></p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;我的设计方案是:</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 1)点击&ldquo;播放&rdquo;按钮:屏幕显示&ldquo;周慧敏&mdash;痴心换情深&rdquo;文字内容,开始播放音乐;</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 2)点击&ldquo;暂停&rdquo;按钮:屏幕显示&ldquo;暂停播放&rdquo;,并暂停播放音乐;</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 3)点击&ldquo;继续&rdquo;按钮:屏幕显示&ldquo;继续播放&rdquo;,等待1s后,屏幕重新显示&ldquo;周慧敏&mdash;痴心换情深&rdquo;文字内容,并继续播放音乐;</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 4)点击&ldquo;停止&ldquo;按钮:清除屏幕显示的文字内容,并结束播放;</p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;在每次点击按钮,由于都要先清除上一步显示的文字,所以一开始我是的操作是:重新绘制背景图片,添加4个按钮,但是程序运行过程中,肉眼明显能看出来屏幕刷新背景和按钮显示的延迟卡顿,不是很友好。</p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;最后,我试了下,在每次点击按钮后,只重新绘制背景图片来实现清除文字的效果,测试后发现,这个方法果然有效,也就是说行空板unihiker库中的按钮作为控件显示,不会被单纯的屏幕显示操作给刷掉,这样一来的话操作就很方便了。</p>

<p><b>&nbsp; &nbsp; &nbsp; &nbsp; (2)音量调整问题</b></p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;由于行空板自带unihiker库中的Audio类没有播放音量调整接口,而我的小音箱也没有音量调整按钮,一开始播放时声音很大,着实吓我一跳,赶紧关掉。</p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;后来在QQ群里问了行空板的技术支持,回复可以通过alsamixer功能实现音量的调整。</p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;alsamixer是alsa驱动的一个插件,是一个命令行下的图形设置工具,在行空板的命令终端中输入alsamixer命令,会显示如下图所示的界面,通过键盘上的上下方向按键可以实现音频播放音量的调整。</p>

<p align="center"></p>

<p style="text-align: center;">&nbsp;图7</p>

<p><b>&nbsp; &nbsp; &nbsp; &nbsp; (3)从头开始播放时等待时间较长</b></p>

<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;点击&ldquo;播放&rdquo;按钮后,需要等待大概20秒后才会开始播放,不知道是不是和Audio类的实现方式有关系,暂时没有找到解决办法。</p>

<p><b>&nbsp; &nbsp; &nbsp; &nbsp; (四)功能演示</b></p>

<p><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b><iframe allowfullscreen="true" frameborder="0" height="450" src="//player.bilibili.com/player.html?bvid=14G4y1d7et&amp;page=1" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2022-11-27 09:21

<p>最后的效果视频放的歌曲好听</p>

天意无罪 发表于 2022-11-27 09:36

Jacktang 发表于 2022-11-27 09:21
最后的效果视频放的歌曲好听

<p>啊哈,我以为你会说歌手长得美才是关键,看来是我想多了啊。<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/lol.gif" width="48" /></p>
页: [1]
查看完整版本: 【行空板 Python编程学习主控板】评测八、使用unihiker库自带的Audio类播放音乐