You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
3.4 KiB
102 lines
3.4 KiB
import React, { useState, useEffect, useRef } from "react";
|
|
import { connect } from "react-redux";
|
|
import request from 'superagent'
|
|
import moment from "moment";
|
|
import { Request } from "@peace/utils";
|
|
import { ApiTable } from "$utils";
|
|
import './videoPlay.less';
|
|
import { DatePicker, Toast, ToastFactory, Space } from '@douyinfe/semi-ui';
|
|
import { checkAudioVideo, uploadVoice2Yingshi, sendVoice2YingshiCamera } from '$utils';
|
|
import AudioRecoder, { RecordState } from "./audioRecoder"
|
|
|
|
const VideoOperationTalk = ({
|
|
videoObj,
|
|
}) => {
|
|
const [recordState, setRecordState] = useState(RecordState.NONE)
|
|
|
|
const ToastInCustomContainer = ToastFactory.create({
|
|
getPopupContainer: () => document.getElementById('vcmp_videoplay'),
|
|
});
|
|
|
|
useEffect(() => {
|
|
|
|
}, [])
|
|
|
|
const startTalk = () => {
|
|
setRecordState(RecordState.START)
|
|
}
|
|
|
|
const stopTalk = () => {
|
|
setRecordState(RecordState.STOP)
|
|
}
|
|
|
|
const onStopTalk = async (data) => {
|
|
setRecordState(RecordState.STOP)
|
|
const { blob: audioData } = data;
|
|
if (!audioData) return;
|
|
let buffer = await audioData.arrayBuffer();
|
|
let file = new File([buffer], Date.now() + "", {
|
|
type: "audio/mpeg"
|
|
});
|
|
|
|
try {
|
|
let uploadRes = await uploadVoice2Yingshi({ voiceFile: file, accessToken: videoObj.yingshiToken, })
|
|
const { url } = uploadRes
|
|
let sendRes = await sendVoice2YingshiCamera({
|
|
accessToken: videoObj.yingshiToken,
|
|
deviceSerial: videoObj.serialNo,
|
|
channelNo: videoObj.channelNo,
|
|
fileUrl: url
|
|
});
|
|
ToastInCustomContainer.success('已发送');
|
|
} catch (error) {
|
|
if (error.msg) {
|
|
ToastInCustomContainer.error(error.msg);
|
|
} else {
|
|
ToastInCustomContainer.error('发送失败');
|
|
}
|
|
}
|
|
}
|
|
|
|
return (
|
|
<div style={{
|
|
position: 'absolute', top: 'calc(50% - 88px)', left: 'calc(50% - 156px)',
|
|
width: 312, height: 186, backgroundColor: '#000000A5',
|
|
}}>
|
|
<img src={`/assets/images/background/${recordState == RecordState.START ? 'talking' : 'talk'}.png`} style={{ display: 'block', margin: '12px auto' }} />
|
|
<div
|
|
style={{
|
|
height: 32, width: 88, textAlign: 'center', margin: 'auto', color: '#fff', backgroundColor: '#1859C1',
|
|
lineHeight: '32px', cursor: 'pointer'
|
|
}}
|
|
onClick={() => {
|
|
checkAudioVideo({ audio: true }).then(res => {
|
|
// console.log('已点击允许,开启成功');
|
|
if (recordState === RecordState.START) {
|
|
stopTalk()
|
|
} else {
|
|
startTalk()
|
|
}
|
|
}).catch(err => {
|
|
ToastInCustomContainer.destroyAll()
|
|
if (err.code && err.code == 404) {
|
|
ToastInCustomContainer.error("浏览器不支持")
|
|
} else {
|
|
ToastInCustomContainer.error("请检查是否存在麦克风,或是否禁用麦克风")
|
|
}
|
|
})
|
|
}}
|
|
>{recordState == RecordState.START ? '结束' : '开始'}讲话</div>
|
|
<AudioRecoder state={recordState} onStop={onStopTalk} />
|
|
</div>
|
|
)
|
|
}
|
|
|
|
function mapStateToProps (state) {
|
|
const { auth } = state;
|
|
return {
|
|
user: auth.user,
|
|
};
|
|
}
|
|
|
|
export default connect(mapStateToProps)(VideoOperationTalk);
|