开发一个 Streamlit 录音组件(二)——支持 iOS 页面
上一篇文章用 Streamlit 写了一个录音按钮的组件,实现了按下去时开始录音、放开结束录音的功能。但是只支持桌面端网页用鼠标点击,这次对齐进行扩展,使其能够实现在手机端按下录音的功能。 Touch 事件 在桌面端监听的是鼠标的 mousedown/mouseup 事件,但是在移动端则是手指触屏屏幕的事件 touchstart/touchend,因此需要修改按钮的监听事件。另外之前采用样式中 :hover 来实现按下时按钮颜色的变化,现在使用一个变量来控制 <template> <div class="button-container"> <button @touchstart="startRecording" @touchcancel="stopRecording" @touchend="stopRecording" @mousedown="startRecording" @mouseup="stopRecording" @mouseleave="stopRecording" class="red-round-button" :style="{ backgroundColor: buttonColor }" ></button> </div> <audio ref="audioPlayer" controls class="audio-player"></audio> </template> <script setup> ... const buttonColor = ref('red'); const dynamicStyles = computed(() => { return { width: props.args.width, height: props.args.height, backgroundColor: buttonColor }; }); ... </script> 另外,移动端长按按钮的话会唤出 Text Selection,需要取消在监听时间时取消掉,详见 Prevent text selection on tap and hold on iOS 13 / Mobile Safari function startRecording(event) { event.preventDefault(); ... } function stopRecording(event) { event.preventDefault(); ... } 录音格式兼容 由于 iOS 的浏览器录制的音频格式与桌面端浏览器不一样(参考 MediaRecorder: isTypeSupported() static method),需要在代码中先判断平台,再根据平台决定录音格式,其中桌面 Chrome 格式为 webm/opus,iOS Safari 为 mp4/aac,然后要将对应格式传回组件返回值 ...