Skip to content
Advertisement

Exception has occurred: error mpg123_seek: Invalid RVA mode. (code 12)

I am recording audio using sounddevice and I want to play it through a virtual audio cable through pygame, I keep receiving this error Exception has occurred: error mpg123_seek: Invalid RVA mode. (code 12)

My code is below:

import sounddevice as sd
from scipy.io.wavfile import write
import random
import pygame
import time

pygame.init()
pygame.mixer.init(devicename='CABLE Input (VB-Audio Virtual Cable)')

fs = 44100  # Sample rate
seconds = 00.1  # Duration of recording


def main():
    for x in range(10000):
        number = random.randint(1,9999999)


        myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2)
        sd.wait()  # Wait until recording is finished
        write(f'output/output{str(number)}.mp3', fs, myrecording)  # Save as WAV file `

        # PLAY MIC SOUND HERE
        pygame.mixer.music.load(f'output/output{str(number)}.mp3') #Load the mp3  
        pygame.mixer.music.play() #Play it
        time.sleep(00.1)

main()

Any help is appreciated.

Advertisement

Answer

There’s a couple of issues.

The first is that scipi.io.wavefile.write() only writes an uncompressed WAV file (ref: https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.wavfile.write.html ). You might name it .mp3, but it’s not compressed that way.

The next issue is that pygame.mixer.music will not .load() uncompressed WAV files. So… what to do…

One work-around is to use the base pygame.mixer, which is happy to load uncompressed WAV. And while I don’t have an ‘CABLE Input (VB-Audio Virtual Cable)’ device, I do get a nice file of silence, which I validated with the sound-editing program Audacity, and this seems to play OK.

import sounddevice as sd
from scipy.io.wavfile import write
import pygame
import time
import random

pygame.init()
pygame.mixer.init(devicename='CABLE Input (VB-Audio Virtual Cable)')

fs = 44100  # Sample rate
seconds = 00.1  # Duration of recording


def main():
    for x in range(10000):
        number = random.randint(1,9999999)

        myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2)
        sd.wait()  # Wait until recording is finished

        filename = f'output/output{str(number)}.wav'
        write(filename, fs, myrecording)  # Save as uncompressed WAV file 

        # PLAY MIC SOUND HERE
        print( "Playing ["  + filename + "]" )

        #pygame.mixer.music.load(filename) #Load the wav
        #pygame.mixer.music.play() #Play it
        #while ( pygame.mixer.music.get_busy() ):  # wait for the sound to end
        #    time.sleep(00.1)

        sound = pygame.mixer.Sound(filename) #Load the wav
        sound.play() #Play it
        while ( pygame.mixer.get_busy() ):  # wait for the sound to end
            time.sleep(00.1)

main()
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement