| | |
| | | import java.util.concurrent.ExecutorService; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.ScheduledFuture; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | import com.alivc.live.pusher.AlivcAudioAACProfileEnum; |
| | |
| | | Timber.d("stopPush called"); |
| | | stopPushThread(); |
| | | // stopAudioTransfer(); |
| | | stopWaterMaskSchedule(); |
| | | releaseAlivcPusher(); |
| | | if (usbCamera != null) { |
| | | usbCamera.stopCamera(); |
| | |
| | | private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); |
| | | private void setWaterMask() { |
| | | |
| | | scheduledExecutorService.scheduleWithFixedDelay(() -> { |
| | | // 防止重复 schedule(startPush 可能被多次调用) |
| | | if (watermarkFuture != null && !watermarkFuture.isCancelled()) { |
| | | return; |
| | | } |
| | | if (scheduledExecutorService == null || scheduledExecutorService.isShutdown()) { |
| | | scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); |
| | | } |
| | | |
| | | watermarkFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> { |
| | | |
| | | |
| | | if (pushStarted){ |
| | |
| | | } |
| | | |
| | | },1,1, TimeUnit.SECONDS); |
| | | } |
| | | |
| | | private ScheduledFuture<?> watermarkFuture; |
| | | |
| | | 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; |
| | | } |
| | | } |
| | | |
| | | private Handler mainHandler = new Handler(Looper.getMainLooper()); |
| | |
| | | * 释放阿里推流资源 |
| | | */ |
| | | private void releaseAlivcPusher() { |
| | | // 兜底:防止外部没有走 stopPush |
| | | stopWaterMaskSchedule(); |
| | | // 移除隐藏的 SurfaceView |
| | | if (previewSurfaceView != null && windowManager != null) { |
| | | try { |