| | |
| | | import java.util.Date; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.ScheduledFuture; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | /** |
| | |
| | | int baseY = 20; |
| | | int fontSize= 24; |
| | | private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); |
| | | private ScheduledFuture<?> watermarkFuture; |
| | | private void setWaterMask() { |
| | | |
| | | scheduledExecutorService.scheduleWithFixedDelay(() -> { |
| | | // 防止重复 schedule(startRecord 可能被多次调用) |
| | | if (watermarkFuture != null && !watermarkFuture.isCancelled()) { |
| | | return; |
| | | } |
| | | if (scheduledExecutorService == null || scheduledExecutorService.isShutdown()) { |
| | | scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); |
| | | } |
| | | |
| | | watermarkFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> { |
| | | |
| | | |
| | | |
| | |
| | | },1,1, TimeUnit.SECONDS); |
| | | } |
| | | |
| | | private void stopWaterMaskSchedule() { |
| | | try { |
| | | if (watermarkFuture != null) { |
| | | watermarkFuture.cancel(true); |
| | | watermarkFuture = null; |
| | | } |
| | | } catch (Throwable t) { |
| | | Timber.w(t, "cancel watermarkFuture failed"); |
| | | } |
| | | try { |
| | | if (scheduledExecutorService != null && !scheduledExecutorService.isShutdown()) { |
| | | scheduledExecutorService.shutdownNow(); |
| | | } |
| | | } catch (Throwable t) { |
| | | Timber.w(t, "shutdown watermark scheduledExecutorService failed"); |
| | | } finally { |
| | | scheduledExecutorService = null; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | |
| | | */ |
| | | public void stopRecord() { |
| | | Timber.d("stopRecord called"); |
| | | |
| | | stopWaterMaskSchedule(); |
| | | |
| | | // 停止音频线程 |
| | | if (audioThread != null) { |
| | |
| | | * 释放资源 |
| | | */ |
| | | private void releaseResources() { |
| | | // 兜底:防止异常退出时水印线程泄露 |
| | | stopWaterMaskSchedule(); |
| | | if (audioRecord != null) { |
| | | try { |
| | | if (audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { |