This commit is contained in:
yumoqing 2022-06-28 11:11:13 +08:00
parent 015ea2f23c
commit 1d67f0cbaf
7 changed files with 16 additions and 207 deletions

View File

@ -1,44 +0,0 @@
import tempfile
import pyaudio
import wave
from kivy.event import EventDispatcher
from kivy.properties import NumericProperty
from kivyblocks.baseWidget import HBox
from kviyblocks.micphone import Micphone
class AudioRecorder(EventDispatcher):
fs = NumericProperty(None)
filename = StringProperty(None)
voice_src = OjbectProperty(None)
def __init__(self, **kw):
super(AudioRecorder, self).__init__(**kw)
self.saving = False
if not self.filename:
self.mk_temp_file()
def mk_temp_file(self):
self.filename = tempfile.mktemp(suffix='.wav')
def on_filename(self, *args):
self.wf = wave.open(self.filename, 'wb')
def on_voice_src(self, *args):
audio_profile = self.voice_src.audio_profile()
self.wf.setnchannels(audio_profile['channels'])
self.wf.setsamplewidth(audio_profile['sample_size'])
self.wf.setframerate(audio_profiel['sample_rate'])
self.voice_src.bind(on_fps=self.write)
def write(self, o, d):
if self.saving:
self.wf.write(''.join(d))
def start(self):
if not self.voice_src.recording:
self.voice_src.start()
self.saving = True
def stop(self):
self.saving = False
wf.close()

View File

@ -1,5 +1,5 @@
from traceback import print_exc from traceback import print_exc
import ujson as json import json
from kivy.properties import StringProperty from kivy.properties import StringProperty
from kivy.factory import Factory from kivy.factory import Factory
from .toolbar import Toolbar from .toolbar import Toolbar

View File

@ -1,67 +0,0 @@
import kivy
import numpy as np
from .micphone import Micphone
from kivy.uix.camera import Camera
from kivy.properties import NumericProperty
from kivy.event import EventDispatcher
from .android_rotation import *
if kivy.platform in [ 'win', 'linux', 'macosx' ]:
from PIL import ImageGrab
class ScreenWithMic(Micphone, EventDispatcher):
def __init__(self, **kw):
super(ScreenWithMic, self).__init__(**kw)
def get_image_data(self):
image = ImageGrab.grab()
imgdata = image.tostring()
return imgdata
def get_fps_data(self, *args):
ad = super(CameraWithMic, self).get_fps_data()
vd = self.get_image_data()
d = {
'v':vd,
'a':ad
}
return d
VS={
ROTATION_0:270,
ROTATION_90:0,
ROTATION_180:90,
ROTATION_270:180,
}
class CameraWithMic(Micphone, Camera):
angle = NumericProperty(0)
def __init__(self, **kw):
super(CameraWithMic, self).__init__(**kw)
self.isAndroid = kivy.platform == 'android'
self.set_angle(-90)
def set_angle(self, angle):
self.angle = angle
def image_rotation(self):
if not self.isAndroid:
return
x = get_rotation()
self.angle = VS[x]
def get_image_data(self):
image = np.frombuffer(self.texture.pixels, dtype='uint8')
image = image.reshape(self.texture.height, self.texture.width, -1)
imgdata = image.tostring()
return imgdata
def get_fps_data(self, *args):
# self.image_rotation()
ad = super(CameraWithMic, self).get_fps_data()
vd = self.get_image_data()
d = {
'v':vd,
'a':ad
}
return d

View File

@ -1,84 +0,0 @@
from threading import Thread, Lock
import pyaudio
from kivy.event import EventDispatcher
from kivy.properties import NumericProperty, ObjectProperty
from kivy.clock import Clock
import wave
CHUNK = 1024
CHANNELS = 2
FORMAT = pyaudio.paInt16
samplerate = 48000
class Micphone(EventDispatcher):
channels = NumericProperty(2)
samplerate = NumericProperty(48000)
fps = NumericProperty(1/60)
def __init__(self, **kw):
super(Micphone, self).__init__(**kw)
self.chunk = CHUNK
self.format = pyaudio.Int16
self.chunk_buffer = []
self.lock = Lock()
self.recoding = False
self._audio = puaudio.PyAudio()
self._mic = p.open(format=self.format,
channels=self.channels,
rate=self.samplerate,
input=True,
frames_per_buffer=self.chunk)
self.sampe_size = self.audio.get_sample_size(self.format)
self.register_event_type('on_fps')
self.register_event_type('on_start')
self.register_event_type('on_end')
self.fps_task = None
def on_fps(self, d):
print('on_fps fired')
def on_start(self):
print('on_start fired')
def on_end(self):
print('on_end fired')
def audio_profile(self):
return {
'channels':self.channels,
'sample_size':self.sample_size,
'sample_rate':self.samplerate
}
def get_frames(self, *args):
d = self.get_fps_data()
self.dispatch('on_fps', d)
def get_fps_data(self, *args):
self.lock.acquire()
d = self.chunk_buffer[:]
self.chunk_buffer = []
self.lock.release()
return d
def start(self, *args):
self.recording = True
Background(self._record)
self.dispatch('on_start')
self.fps_task = Clock.schedule_interval(self.get_frames, self.fps)
def _record(self):
self.recording = True
while self.recording:
data = self._mic.read(self.chunk)
self.lock.acquire()
self.hunk_buffer.append(data)
self.lock.release()
def stop(self, *args):
self.recording = False
self.fps_task.cancel()
self.dispatch('on_end')
def close(self):
self._mic.stop_stream()
self._mic.close()
self._audio.close()

View File

@ -31,9 +31,9 @@ from .markdown import Markdown
from .defaultimage import * from .defaultimage import *
from .price import * from .price import *
if kivy.platform in ['win','linux', 'macosx']: #if kivy.platform in ['win','linux', 'macosx']:
from .camerawithmic import ScreenWithMic # from .camerawithmic import ScreenWithMic
from .camerawithmic import CameraWithMic #from .camerawithmic import CameraWithMic
from .scrollpanel import ScrollPanel from .scrollpanel import ScrollPanel
from .udp_widget import UdpWidget from .udp_widget import UdpWidget
from .paging import PageLoader from .paging import PageLoader
@ -44,8 +44,8 @@ from .price import PriceView
from .ffpyplayer_video import FFVideo from .ffpyplayer_video import FFVideo
r = Factory.register r = Factory.register
if kivy.platform in ['win','linux', 'macosx']: # if kivy.platform in ['win','linux', 'macosx']:
r('ScreenWithMic', ScreenWithMic) # r('ScreenWithMic', ScreenWithMic)
r('DateInput', DateInput) r('DateInput', DateInput)
r('HTTPSeriesData', HTTPSeriesData) r('HTTPSeriesData', HTTPSeriesData)
r('HTTPDataHandler', HTTPDataHandler) r('HTTPDataHandler', HTTPDataHandler)
@ -53,7 +53,7 @@ r('PageLoader', PageLoader)
r('UdpWidget', UdpWidget) r('UdpWidget', UdpWidget)
r('ScrollPanel', ScrollPanel) r('ScrollPanel', ScrollPanel)
r('TextInput', TextInput) r('TextInput', TextInput)
r('CameraWithMic', CameraWithMic) # r('CameraWithMic', CameraWithMic)
# r('CustomCamera', CustomCamera) # r('CustomCamera', CustomCamera)
# r('QrReader', QrReader) # r('QrReader', QrReader)
r('Markdown', Markdown) r('Markdown', Markdown)

View File

@ -7,4 +7,8 @@
# fix bug in __init__.py, can not import kivy here # fix bug in __init__.py, can not import kivy here
# __version__ = '0.2.11' # __version__ = '0.2.11'
# move all the source using opencv to a independent module # move all the source using opencv to a independent module
__version__ = '0.2.12' # __version__ = '0.2.12'
# move code using pyaudio to a independent module
# __version__ = '0.2.13'
# use json replace ujson because kivy-ios can not compile ujson
__version__ = '0.2.14'

View File

@ -26,7 +26,7 @@ package_data = {
'ttf/*.ttf', 'ttf/*.ttf',
'ui/*.uidesc', 'ui/*.uidesc',
'xcamera/xcamera.kv', 'xcamera/xcamera.kv',
'image_processing/cascades/haarcascade_frontalface_default.xml', # 'image_processing/cascades/haarcascade_frontalface_default.xml',
'xcamera/data/*' 'xcamera/data/*'
], ],
} }
@ -48,11 +48,11 @@ setup(
], ],
packages=[ packages=[
'kivyblocks', 'kivyblocks',
'kivyblocks.image_processing', # 'kivyblocks.image_processing',
'kivyblocks.mapview', 'kivyblocks.mapview',
'kivyblocks.uitype', 'kivyblocks.uitype',
'kivyblocks.widgetExt', 'kivyblocks.widgetExt'
'kivyblocks.xcamera' # 'kivyblocks.xcamera'
], ],
package_data=package_data, package_data=package_data,
keywords = [ keywords = [