×

7个步骤让Raspberry Pi播放音乐(源代码)

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-21

分享资料个

李·道斯韦特

您现有的 hifi 系统是否太旧而无法支持 Apple AirPlay?不想用质量较低的无线扬声器替换它,但又想播放音乐?这是一个常见的问题。好消息是,您可以用 Raspberry Pi 的成本构建一个 AirPlay 服务器,这样您就可以将音乐直接从 iPhone 或 iPad 流式传输到您的 hifi 系统。

本指南向您展示了如何设置,shairport-sync以便通过 7 个简单的步骤让 Raspberry Pi 播放音乐。

在你开始前

在将 Raspberry Pi 设置为 AirPlay 服务器之前,您需要做一些事情。

选择树莓派

你可能已经有一个了。大多数模型都应该可以工作,但 Pi Zero 将是一个问题,因为在 Zero 上建立网络更加困难。我建议您在开始之前使用谷歌搜索以了解如何执行此操作。

如果你有一个零 W 模型,那么事情会更容易,只要你没有任何其他重型东西在运行,那里的单核 CPU 就可以很好地进行流式传输。

如果您要购买新车,我建议您购买 Model 3。我使用 Model 3 A+ 没有任何问题,因为我想要更小的外形、wifi 和足够的噪音。Raspberry Pi 3 Model B的性能同样出色。

选择操作系统

您需要的第一件事是带有适当操作系统的 SD 卡。现在有很多不同的选择,从“传统的”Raspbian 到专用的媒体操作系统,甚至是 Windows 10 IoT。

现在,AirPlay 服务器不像 Kodi 那样需要丰富的图形界面。完全可以在没有 UI 的情况下运行它,因为所有用户交互都将在 iOS 或 macOS 设备上完成。拥有某种显示当前艺术家和曲目信息的显示器可能会很好,但这是一个非常艰巨的目标。现在,集中精力让服务器正常工作!

因此,随着这一点的建立,您应该寻找一个更准系统的系统。不需要大量的应用程序,为了实现无故障操作,您希望运行的进程越少越好。这是为媒体流应用程序保留尽可能多的 CPU 和 RAM。

一个问题是一些准系统操作系统,例如 Arch Linux,是针对具有相当多 Linux 知识的人。它们非常先进,您在安装第三方应用程序和库时更有可能遇到问题。

在光谱的另一端,有一些专用于此任务的发行版,应该开箱即用,但您不会从中学到任何东西。

出于这些原因,如果这是您第一次安装 AirPlay 设备,我建议您选择 Raspbian Lite。它是成熟的,因为它源自原始的 Raspbian 操作系统,但它已经删除了 GUI 以节省资源。它完全由命令行驱动,可以轻松配置为以“无头”模式运行,即无需键盘或显示器即可通过网络完全远程访问。这使得它非常适合放入设备中,希望您能在此过程中学到一些东西。

安装 Raspbian Lite 并启用 SSH

如果您已经进行了安装,或者有信心自己完成该部分,请继续。

否则请按照下面的教程进行操作,该教程将带您逐步从原始 Raspberry Pi 到支持 SSH 的 Raspbian Lite:-

如何在 30 分钟内设置您可以从任何地方控制的 Raspberry Pi

设置完成后,您应该能够从网络上的另一台计算机远程登录 Raspberry Pi,并且您的 Pi 应该可以访问互联网。

配置 AirPlay 服务器

首先,您需要安装一些依赖项,以便构建 AirPlay 服务器应用程序。运行以下命令:-

sudo apt-get update sudo apt-get install autoconf automake avahi-daemon build-essential git libasound2-dev libavahi-client-dev libconfig-dev libdaemon-dev libpopt-dev libssl-dev libtool xmltoman

2. 构建并安装 shairport-sync

shairport-sync是由Mike Brady维护的一款很棒的软件。它将您的 Linux 机器变成 Apple AirPlay 服务器。它最好的事情之一是它完全在命令行上运行,虽然它有上百万个配置选项,但开箱即用非常容易。

首先从 github 上抓取它:-

git clone https://github.com/mikebrady/shairport-sync.git

现在导航到shairport-sync目录并配置构建:-

cd shairport-sync autoreconf -i -f ./configure --with-alsa --with-avahi --with-ssl=openssl --with-systemd --with-metadata

最后构建并安装应用程序:-

make sudo make install

在此过程结束时,您应该可以正常安装shairport-sync.

3.配置音频输出

您现在可以测试 Airplay 音频了。首先你需要一些硬件。以下任何一项都有效:-

耳机,或任何带有 3 毫米插孔的旧耳塞

来自台式电脑的有源扬声器

或者,如果您是认真的,可以使用带有电缆的高保真放大器,该电缆可将 3.5 毫米插孔转换为一对 RCA 唱机插头

现在您需要在 Raspberry Pi 上配置音频路径。它通常设置为“自动”,但您需要强制它连接到 3.5 毫米插孔。运行raspi-config:-

sudo raspi-config

选择7. Advanced Options ,然后选择A4。Audio ,然后选择选项1. Force 3.5mm ('headphone') jack 。这将强制音频路径到 3.5 毫米耳机插孔。

4.设置音量

音量可能会非常低,因此使用以下方法将其更改为最大:-

amixer sset PCM,0 100%

音量设置有点难用,因为它是以dB (分贝)为单位配置的,如果您不是工程师,这会非常不直观。以分贝表示,满音量一般为0dB,零音量在-100dB左右。所以好像这还不够糟糕——这是主要的脑筋急转弯—— 分贝标度不是线性的。

因此,当您在上面的命令中使用 % 表示法时amixer,您可能会认为它像普通音量控制一样工作,但事实并非如此。如果你想让音量稍微低一点,你可以把它改成 80%:-

amixer sset PCM,0 80%

您会看到输出报告大约为 -17dB,但至关重要的是您会注意到它几乎听不见。百分比直接转换为分贝,结果是您只能真正听到超过 70% 左右的任何声音。

所以,TLDR:将音量设置为 100%。

5. 测试 AirPlay 到 Raspberry Pi

现在开始shairport-sync:-

sudo service shairport-sync start

在你开始使用 AirPlay 之前什么都不会发生,所以拿一部 iPhone 或支持 AirPlay 的东西,并确保它与 Raspberry Pi 在同一个网络上。开始播放一些音乐,然后从 AirPlay 图标中选择“raspberrypi”,然后选择“完成”。

如果您听不到任何声音,请将您的 iPhone(或您使用的任何来源)音量调高,因为 Raspberry Pi 上的 PCM(耳机)输出不是很好。

此时您应该可以听到通过 Raspberry Pi 播放的音乐!

6.配置shairport-sync自动启动

显然,在专用媒体播放器中,您不想手动启动服务:您希望shairport-sync在 Pi 启动后立即运行。幸运的是,我们配置了它的systemd运行,这意味着我们可以轻松地使服务自动启动。只需输入:-

sudo systemctl enable shairport-sync

这将输出类似于此的消息:-

Created symlink /etc/systemd/system/multi-user.target.wants/shairport-sync.service → /lib/systemd/system/shairport-sync.service.

这就是创建持久 AirPlay 服务器所需要做的全部工作。重启:-

sudo reboot

当您通过 SSH 重新登录时,您可以shairport-sync像这样查询服务:-

sudo systemctl status shairport-sync.service

这将(希望)产生类似的东西: -

● shairport-sync.service - Shairport Sync - AirPlay Audio Receiver
    Loaded: loaded (/lib/systemd/system/shairport-sync.service; enabled; vendor preset: enabled)
    Active: active (running) since Wed 2018-12-05 22:30:26 GMT; 1min 16s ago 
Main PID: 515 (shairport-sync)
    CGroup: /system.slice/shairport-sync.service
            └─515 /usr/local/bin/shairport-sync Dec 05 22:30:26 raspberrypi systemd[1]: Started Shairport Sync - AirPlay Audio Receiver.

因此,您现在应该可以在每次启动树莓派时通过 AirPlay 播放树莓派。

7. 防止 Wifi 掉线

Raspberry Pi wifi 会周期性进入省电模式,这会在使用 AirPlay 时导致严重的音频故障。您可以通过在文件中添加一行来防止这种情况/etc/network/interfaces 。使用以下命令编辑文件:-

sudo nano /etc/network/interfaces

转到文件末尾并添加行:-

# Disable wifi power management wireless-power off

在这一切之后,重新启动:-

sudo reboot

现在你应该启动并运行了!

故障排除

如果您看不到raspberrypiAirPlay 中列出的设备,请检查shairport-sync服务是否正在运行:-

sudo systemctl status shairport-sync.service

检查它是否与您的 AirPlay 源设备在同一个 LAN 上,最好在同一个 Wifi 网络上,并且在范围内。

如果您已连接到 AirPlay 但听不到任何音频,请检查音量是否足够高。

在源设备上,只需将音量滑动到大约 80–90%。

对于 Raspberry Pi PCM 音频,使用以下方法检查音量设置:-

amixer sget PCM

这将像这样输出当前设置:-

Mono: Playback 400 [100%] [4.00dB] [on]

如果您看到任何低于 70% (-27dB) 的声音,那么您可能听不到。最好将此设置保持在 100%。

显然也要检查您的音频硬件!

音频质量注意事项

这篇文章在 Hacker News 上发表后引起了很大的兴趣,许多人提到了 Raspberry Pi 内置音频插孔的音频质量差。我正计划写一篇关于使用 DAC 板来改善音频的后续文章,但在我开始讨论之前,我可能应该在这里提及它。

我试过两个 DAC 板。第一个是 IQAudIO PiDAC+,它具有适合新的 Pi 3 Model A+ 的完美外形。我还在 Pi Zero W 上使用了HiFiBerry DAC+ Zero 。它们的设置都非常简单,而且听起来很棒。

另一个我还没有亲自使用过的非常流行的是Pimoroni pHAT DAC 。

我还没有对它们进行认真的比较测试,但是选择其中一个,你会发现音频质量有了巨大的提高。

谢谢!

 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'7个步骤让Raspberry Pi播放音乐(源代码)',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);