【问题标题】:Play audio and get current second of playback using Python?使用 Python 播放音频并获取当前的播放秒数?
【发布时间】:2019-11-26 13:16:25
【问题描述】:

我正在使用 python 开发语音界面。我在播放音频时遇到问题。

你用什么来黑掉树莓派上简单的 mp3 文件?

我需要播放音频,在播放结束前 2 秒我需要开始另一个任务(打开麦克风的流) 我该如何存档?可能的问题是我还没有找到读取当前播放秒数的方法。如果我能读到这篇文章,我会在当前时间为 audiolength - 2 秒时启动一个新线程。

希望您能帮助我或对此有任何经验。

【问题讨论】:

    标签: python pyaudio sox


    【解决方案1】:

    试试just_playback。它是我围绕 miniaudio 编写的一个包装器,它提供了播放控制功能,例如暂停、恢复、搜索、获取当前播放位置和设置播放音量。

    【讨论】:

      【解决方案2】:

      我找到了解决方案。 PyAudio 提供了一种逐块播放音频的方法。通过它,您可以读取当前块并将其与音频的整体大小进行比较。

      class AudioPlayer():
          """AudioPlayer class"""
          def __init__(self):
              self.chunk = 1024
              self.audio = pyaudio.PyAudio()
              self._running = True
      
      
          def play(self, audiopath):
              self._running = True
              #storing how much we have read already
              self.chunktotal = 0
              wf = wave.open(audiopath, 'rb')
              stream = self.audio.open(format =self.audio.get_format_from_width(wf.getsampwidth()),channels = wf.getnchannels(),rate = wf.getframerate(),output = True)
              print(wf.getframerate())
              # read data (based on the chunk size)
              data = wf.readframes(self.chunk)
              #THIS IS THE TOTAL LENGTH OF THE AUDIO
              audiolength = wf.getnframes() / float(wf.getframerate())
      
              while self._running:
                  if data != '':
                      stream.write(data)
                      self.chunktotal = self.chunktotal + self.chunk
                      #calculating the percentage
                      percentage = (self.chunktotal/wf.getnframes())*100
                      #calculating the current seconds
                      current_seconds = self.chunktotal/float(wf.getframerate())
                      data = wf.readframes(self.chunk)
      
                  if data == b'':
                      break
      
              # cleanup stream
              stream.close()
      
          def stop(self):
              self._running = False
      

      希望它可以帮助某人, 亚历克斯

      【讨论】:

        猜你喜欢
        • 2018-02-20
        • 2017-05-27
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多