| | |
| | | } |
| | | |
| | | /** |
| | | * 开始推流 |
| | | * 开始推流(对外接口) |
| | | * 注意:AlivcLivePusher 必须在主线程初始化,否则会抛出 |
| | | * "Can't create handler inside thread that has not called Looper.prepare()" |
| | | */ |
| | | public void startPush(MediaArgu media) { |
| | | // 确保在主线程执行实际的启动逻辑 |
| | | if (Looper.myLooper() == Looper.getMainLooper()) { |
| | | startPushInternal(media); |
| | | } else { |
| | | // 当前是 Binder 线程或其他后台线程,切到主线程 |
| | | mainHandler.post(() -> startPushInternal(media)); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 真正的启动推流逻辑,必须在主线程调用 |
| | | */ |
| | | private void startPushInternal(MediaArgu media) { |
| | | if (media == null) { |
| | | notifyCallback(1, -1, "MediaArgu is null"); |
| | | return; |
| | |
| | | } |
| | | |
| | | try { |
| | | // 初始化推流SDK |
| | | // 初始化推流SDK(此时已保证在主线程) |
| | | initAlivcPusher(); |
| | | setWaterMask(); |
| | | pushStarted = false; |
| | |
| | | |
| | | cameraExists = true; |
| | | Timber.d("USB摄像头打开成功"); |
| | | |
| | | |
| | | notifyCallback(1, 0, "推流线程已启动,等待推流状态就绪"); |
| | | } catch (Exception e) { |
| | |
| | | response.setType(type); |
| | | response.setErrCode(errCode); |
| | | response.setMessage(message); |
| | | // 设置 cameraId:根据 usbCameraId 区分 P1(1) 和 P2(2) |
| | | if (mediaArgu != null) { |
| | | int usbCameraId = mediaArgu.getUsbCameraId(); |
| | | response.setCameraId(usbCameraId == 2 ? 2 : 1); // 2 -> P2, 其他 -> P1 |
| | | } else { |
| | | response.setCameraId(1); // 默认 P1 |
| | | } |
| | | callback.onResult(response); |
| | | } |
| | | } |