如何在 Racket 中播放 mp3/音频文件?

Posted

技术标签:

【中文标题】如何在 Racket 中播放 mp3/音频文件?【英文标题】:How play mp3/audio files in Racket? 【发布时间】:2020-06-15 15:23:46 【问题描述】:

我打算为球拍制作一个 cli 音频播放器,作为学习球拍的练习,以及与该项目相关的所有其他内容。我被困住了如何开始。我找不到任何播放声音文件的包,所以我猜我可能必须制作一个。我该怎么办?

【问题讨论】:

这是个好问题。我在任何地方都找不到“播放 mp3”功能。 是的,似乎有一个用于播放 OGG 文件(这是一个相当低级的库)。我该如何开始? 如果您熟悉数字音频,您可以使用rsound 模块并编写您自己的实现。或者,您可以使用 PortAudio 或 OpenAL 进行 FFI。 &贵族考虑回答你自己的问题 【参考方案1】:

您可能想要的是#lang video (website)。它为音频播放提供了高级接口。允许您执行以下操作:

#lang video
(clip "file.mp3")

既然你想做一个小小的命令行播放器,你可能还想看看它的小preview tool。

【讨论】:

【参考方案2】:

我通过球拍调用 shell 脚本结束了这种骇人听闻的方式,一点也不理想。作为参考,把代码放在这里。

; This creates the initail rsound
; for a song, this rsound is passed around
; so the whole song doesn't have to be
; decoded from the file everytime.
(define (play filepath)
  (cond [(string=? "mp3" (last (regexp-split #rx"\\." filepath)))
         (system* "./mp3-hack" filepath)
         (set! filepath "curr.wav")])
  (define input-pstream (make-pstream))
  (define input-rsound (rs-read filepath))
  (pstream-play input-pstream input-rsound)
  (values input-pstream input-rsound filepath))

而 mp3-hack 文件只使用 ffmpeg

#!/bin/sh
ffmpeg -i $1 -acodec pcm_s16le -ac 1 -ar 44100 curr.wav 

是的,我知道。不优雅,但至少我得到了它的工作。我的黑客马拉松项目需要它MPEGMafia

【讨论】:

以上是关于如何在 Racket 中播放 mp3/音频文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何用AVAudioPlayer依次播放多个音频文件

如何用js控制audio元素连续播放mp3文件

如何在 AVAudioPlayer 中循环播放多个音频文件?

如何使用千千静听转换MP3文件?

OpenCV中如何播放avi文件的音频

[HTML] 如何用html播放mp3文件?