152 lines
3.9 KiB
Python
152 lines
3.9 KiB
Python
import board
|
|
import audio, video
|
|
from Maix import I2S
|
|
import gc
|
|
|
|
spk_b = None
|
|
spk_d = None
|
|
spk_w = None
|
|
|
|
|
|
def spk_init(BLK=8, WS=9, DAT=10, sample_rate=16000):
|
|
global spk_b
|
|
global spk_d
|
|
global spk_w
|
|
spk_b = BLK
|
|
spk_d = DAT
|
|
spk_w = WS
|
|
board.register(DAT, board.FPIOA.I2S0_OUT_D1)
|
|
board.register(BLK, board.FPIOA.I2S0_SCLK)
|
|
board.register(WS, board.FPIOA.I2S0_WS)
|
|
wav_dev = I2S(I2S.DEVICE_0)
|
|
wav_dev.channel_config(
|
|
I2S.CHANNEL_1,
|
|
I2S.TRANSMITTER,
|
|
resolution=I2S.RESOLUTION_16_BIT,
|
|
cycles=I2S.SCLK_CYCLES_32,
|
|
align_mode=I2S.STANDARD_MODE,
|
|
)
|
|
wav_dev.set_sample_rate(sample_rate)
|
|
spk_rep = wav_dev
|
|
return wav_dev
|
|
|
|
|
|
def mic_init(BLK=35, WS=33, DAT=34, sample_rate=16000):
|
|
board.register(DAT, board.FPIOA.I2S2_IN_D0)
|
|
board.register(BLK, board.FPIOA.I2S2_SCLK)
|
|
board.register(WS, board.FPIOA.I2S2_WS)
|
|
wav_dev = I2S(I2S.DEVICE_2)
|
|
wav_dev.channel_config(
|
|
I2S.CHANNEL_0,
|
|
I2S.RECEIVER,
|
|
resolution=I2S.RESOLUTION_16_BIT,
|
|
cycles=I2S.SCLK_CYCLES_32,
|
|
align_mode=I2S.STANDARD_MODE,
|
|
)
|
|
wav_dev.set_sample_rate(sample_rate)
|
|
return wav_dev
|
|
|
|
|
|
def audio_play(I2S, path, num=80):
|
|
try:
|
|
player = audio.Audio(path=path)
|
|
except Exception as e:
|
|
raise NameError("No audio file loaded or {}".format(e))
|
|
player.volume(num)
|
|
wav_info = player.play_process(I2S)
|
|
I2S.set_sample_rate(wav_info[1])
|
|
while True:
|
|
ret = player.play()
|
|
if ret == None:
|
|
print("Format Error")
|
|
break
|
|
elif ret == 0:
|
|
print("Play end \n")
|
|
player.finish()
|
|
break
|
|
player.__deinit__()
|
|
gc.collect()
|
|
|
|
|
|
def audio_record(I2S, path, record_time, sample_rate=16000):
|
|
try:
|
|
recorder = audio.Audio(path=path, is_create=True, samplerate=sample_rate)
|
|
except Exception as e:
|
|
raise NameError("Need audio storage location or {}".format(e))
|
|
queue = []
|
|
frame_cnt = record_time * sample_rate // 2048
|
|
for i in range(frame_cnt):
|
|
tmp = I2S.record(2048 * 2)
|
|
if len(queue) > 0:
|
|
ret = recorder.record(queue[0])
|
|
queue.pop(0)
|
|
I2S.wait_record()
|
|
queue.append(tmp)
|
|
print("record:{}s".format(round(((frame_cnt - i - 1) / 7.7), 1)))
|
|
recorder.finish()
|
|
recorder.__deinit__()
|
|
del recorder
|
|
print("Audio record finish \n")
|
|
gc.collect()
|
|
|
|
|
|
def video_play(I2S1, path, num=80):
|
|
try:
|
|
global spk_b
|
|
global spk_d
|
|
global spk_w
|
|
import lcd
|
|
|
|
lcd.init()
|
|
I2S = spk_init(spk_b, spk_w, spk_d)
|
|
vide = video.open(path)
|
|
except Exception as e:
|
|
raise NameError("No video file loaded or {}".format(e))
|
|
vide.volume(num)
|
|
while True:
|
|
try:
|
|
ret = vide.play()
|
|
except Exception as e:
|
|
raise NameError("Video format error or {}".format(e))
|
|
if ret == None:
|
|
print("Format Error")
|
|
break
|
|
elif ret == 0:
|
|
print("Play end \n")
|
|
break
|
|
vide.__del__()
|
|
del vide
|
|
del I2S
|
|
gc.collect()
|
|
|
|
|
|
def video_record(I2S, path, record_time):
|
|
import sensor, lcd
|
|
|
|
lcd.init()
|
|
try:
|
|
v = video.open(
|
|
path,
|
|
audio=False,
|
|
record=True,
|
|
interval=200000,
|
|
quality=80,
|
|
width=240,
|
|
height=240,
|
|
)
|
|
except Exception as e:
|
|
raise NameError("Need video storage location or {}".format(e))
|
|
record_time = record_time * 5
|
|
for i in range(record_time):
|
|
try:
|
|
img = sensor.snapshot()
|
|
except:
|
|
raise NameError("Need to initialize camera")
|
|
lcd.display(img)
|
|
v.record(img)
|
|
print("record {}s".format(round((record_time - i - 1) * 0.2, 1)))
|
|
v.record_finish()
|
|
print("Video record finish \n")
|
|
v.__del__()
|
|
gc.collect()
|