import 'dart:async'; import 'package:flutter/services.dart'; class DubbingLib { static final DubbingLib _instance = DubbingLib(); static DubbingLib get instance => _instance; static const MethodChannel _channel = const MethodChannel('dubbing_lib'); StreamController _onProgressChange; StreamController _onRecordProgressChange; StreamController _onDecodeResultChange; StreamController _onEvaluatorResultChange; Stream get progressChange => _onProgressChange.stream; Stream get recordProgressChange => _onRecordProgressChange.stream; Stream get decodeResultChange => _onDecodeResultChange.stream; Stream get evaluatorResultChange => _onEvaluatorResultChange.stream; static Future get platformVersion async { final String version = await _channel.invokeMethod('getPlatformVersion'); return version; } Future init() { return _channel.invokeMethod("initSpeechSdk"); } Future setExtraFullScreen() { //todo 暂时视频播放时全屏StatusBar bug return _channel.invokeMethod("setExtraFullScreen"); } Future> findIsExistCacheVideo(String videoId) { return _channel.invokeMethod>("findIsExistCacheVideo", {"videoId": videoId}); } Future downLoadVideo(String videoUrl) { return _channel.invokeMethod("downLoadVideo", {"url": videoUrl}); } Future pauseRecordAudio() { return _channel.invokeMethod("pauseRecordAudio"); } /// 返回录音文件地址 Future startRecord(int index, int duration, String fileName, String content) { return _channel.invokeMethod("startRecord", {"duration": duration, "fileName": fileName, "index": index, "content": content}); } Future playRecordAudio(String filePath) { return _channel.invokeMethod("playRecordAudio", {"fileName": filePath}); } /// 返回合成视频文件地址 Future startMixinAudio(String videoId, String bgmUrl, List endTimeList, List decodeAudioPathList, List durationList, String localVideoPath) { return _channel.invokeMethod("startMixinAudio", {"videoId": videoId, "bgmUrl": bgmUrl, "endTimeList": endTimeList, "audioDecodePaths": decodeAudioPathList, "durationList": durationList, "videoPath": localVideoPath}); } Future cleanAudioData(String videoId) { return _channel.invokeMethod("cleanAudioData", {"videoId": videoId}); } /// 初始化listener 进入录音页面时调用 void initListener() { _onProgressChange = new StreamController.broadcast(); _onRecordProgressChange = new StreamController.broadcast(); _onDecodeResultChange = new StreamController.broadcast(); _onEvaluatorResultChange = new StreamController.broadcast(); _channel.setMethodCallHandler(_onMethodCallHandler); } /// 1,下载视频进度 2.录音进度 3.解码录音回调 4.语音评测结果 Future _onMethodCallHandler(MethodCall call) { switch (call.method) { case "downloadUpdate": _onProgressChange.add(call.arguments['progress']); break; case "recordProgress": _onRecordProgressChange.add(call.arguments['progress']); break; case "decodeResult": _onDecodeResultChange.add(call.arguments); break; case "evaluatorResult": _onEvaluatorResultChange.add(call.arguments); break; } return null; } /// 关闭stream void closeStream() { _channel.setMethodCallHandler(null); _onProgressChange.close(); _onRecordProgressChange.close(); _onDecodeResultChange.close(); _onEvaluatorResultChange.close(); } }