Android SDK падает при паблише стрима без видео

sanchek

New Member
При создании попытке паблиша стрима без видео падает NPE.
Java:
        StreamOptions streamOptions = new StreamOptions();
        Constraints constraints = streamOptions.getConstraints();

        VideoConstraints videoConstraints = constraints.getVideoConstraints();
        videoConstraints.setCameraId(1);

        streamOptions.getConstraints().updateVideo(false);   // <--- устанавливает VideoConstraints=null
        stream = Flashphoner.createSession(generateSessionOptions()).createStream(streamOptions);
        stream.publish();
внутри метода publish() есть проверка:

Code:
public synchronized void publish() {
        if (!this.stopped) {
            this.setDefaultResolution(); //<--падает тут
            ....
Есть ли возможность как-то начать паблишить стрим без видео?

Версия SDK 1.1.0.58
 

Max

Administrator
Staff member
Добрый день.
Пример Media Devices показывает, как опубликовать поток без видео или без аудио. Проверьте, воспроизводится ли проблема в собранном примере media-devices-debug.apk из сборки 1.1.0.58 (для публикации потока без видео снимаете галочку Send video). Если проблема не воспроизводится, посмотрите, как настраиваются констрейнты и публикуется поток в исходном коде примера:
создание стрима
Code:
            final String streamName = mStreamNameView.getText().toString();
            StreamOptions streamOptions = new StreamOptions(streamName);
            // Здесь настраиваются констрейнты
            Constraints constraints = getConstraints();
            streamOptions.setConstraints(constraints);
            String[] stripCodec = {(String) mStripStreamerCodec.getSpinner().getSelectedItem()};
            streamOptions.setStripCodecs(stripCodec);
            streamOptions.setTransport(Transport.valueOf(mTransportOutput.getSpinner().getSelectedItem().toString()));

            // Здесь создается объект стрима
            publishStream = session.createStream(streamOptions);
            ...
            
            // Здесь запрашиваются разрешения и публикуется стрим
            ActivityCompat.requestPermissions(MediaDevicesActivity.this,
                    new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA},
                    PUBLISH_REQUEST_CODE);
настройка констрейнтов
Code:
    private Constraints getConstraints() {
        AudioConstraints audioConstraints = null;
        if (mSendAudio.isChecked()) {
            audioConstraints = new AudioConstraints();
            if (mUseFEC.isChecked()) {
                audioConstraints.setUseFEC(true);
            }
            if (mUseStereo.isChecked()) {
                audioConstraints.setUseStereo(true);
            }
            if (!mDefaultPublishAudioBitrate.isChecked() && mDefaultPublishAudioBitrate.getText().length() > 0) {
                audioConstraints.setBitrate(Integer.parseInt(mPublishAudioBitrate.getText().toString()));
            }
        }
        VideoConstraints videoConstraints = null;
        // Если переключатель Send Video не установлен, videoConstraints остается null (не false!)
        if (mSendVideo.isChecked()) {
            videoConstraints = new VideoConstraints();
            videoConstraints.setCameraId(((MediaDevice) mCameraSpinner.getSpinner().getSelectedItem()).getId());
            if (mCameraFPS.getText().length() > 0) {
                videoConstraints.setVideoFps(Integer.parseInt(mCameraFPS.getText().toString()));
            }
            if (mWidth.getText().length() > 0 && mHeight.getText().length() > 0) {
                videoConstraints.setResolution(Integer.parseInt(mWidth.getText().toString()),
                        Integer.parseInt(mHeight.getText().toString()));
            }
            if (!mDefaultPublishVideoBitrate.isChecked()) {
                setVideoBitrate(videoConstraints);
            }
        }
        return new Constraints(audioConstraints, videoConstraints);
    }
публикация после получения разрешений от пользователя
Code:
            case PUBLISH_REQUEST_CODE: {
                if (grantResults.length == 0 ||
                        grantResults[0] != PackageManager.PERMISSION_GRANTED ||
                        grantResults[1] != PackageManager.PERMISSION_GRANTED) {
                    muteButton();
                    session.disconnect();
                    Log.i(TAG, "Permission has been denied by user");
                } else {
                    /**
                     * Method Stream.publish() is called to publish stream.
                     */
                    publishStream.publish();
                    Log.i(TAG, "Permission has been granted by user");
                }
                break;
            }
 

Max

Administrator
Staff member
Проверьте, воспроизводится ли проблема на этом же устройстве в браузере Chrome, в примере Media Devices https://wcs:8444/client2/examples/demo/streaming/media_devices_manager/media_device_manager.html. Если проблема воспроизводится, скорее всего, это связано с конкретным устройством и его прошивкой. В этом случае попробуйте сделать полный сброс, убедитесь, что не используется кастомная прошивка.
Также убедитесь, что предоставляете приложению доступы к камере и микрофону по запросу.
Обратите внимание, что тестировать WebRTC стриминг необходимо на физическом устройстве, а не на эмуляторе.
Если полный сброс не помогает, разрешения предоставлены, но поток не публикуется из нашего приложения, соберите лог на устройстве, соберите отчет на стороне сервера, включая дебаговые логи с помощью скрипта report.sh, укажите модель устройства и его прошивку, версию Android и отправьте, используя эту форму.
 

sanchek

New Member
Отправил, продублирую сюда

Code:
2022-11-24 14:52:01.447 30112-30112 AndroidRuntime          com...oner.wcsexample.media_devices  E  FATAL EXCEPTION: main
                                                                                                    Process: com.flashphoner.wcsexample.media_devices, PID: 30112
                                                                                                    java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=100, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.flashphoner.wcsexample.media_devices/com.flashphoner.wcsexample.mediadevices.MediaDevicesActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.flashphoner.fpwcsapi.constraints.VideoConstraints.getWidth()' on a null object reference
                                                                                                        at android.app.ActivityThread.deliverResults(ActivityThread.java:5567)
                                                                                                        at android.app.ActivityThread.handleSendResult(ActivityThread.java:5606)
                                                                                                        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54)
                                                                                                        at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
                                                                                                        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
                                                                                                        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2374)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:233)
                                                                                                        at android.os.Looper.loop(Looper.java:344)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8248)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:589)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1071)
                                                                                                    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.flashphoner.fpwcsapi.constraints.VideoConstraints.getWidth()' on a null object reference
                                                                                                        at com.flashphoner.fpwcsapi.session.Stream.setDefaultResolution(Stream.java:640)
                                                                                                        at com.flashphoner.fpwcsapi.session.Stream.publish(Stream.java:120)
                                                                                                        at com.flashphoner.wcsexample.mediadevices.MediaDevicesActivity.onRequestPermissionsResult(MediaDevicesActivity.java:1098)
                                                                                                        at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:8619)
                                                                                                        at android.app.Activity.dispatchActivityResult(Activity.java:8476)
                                                                                                        at android.app.ActivityThread.deliverResults(ActivityThread.java:5560)
                                                                                                        at android.app.ActivityThread.handleSendResult(ActivityThread.java:5606) 
                                                                                                        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54) 
                                                                                                        at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) 
                                                                                                        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
                                                                                                        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2374) 
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                                                                        at android.os.Looper.loopOnce(Looper.java:233) 
                                                                                                        at android.os.Looper.loop(Looper.java:344) 
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8248) 
                                                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:589) 
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1071)
проблема в том, что VideoConstraints=null, а в методе com.flashphoner.fpwcsapi.session.Stream#publish это не предусмторено
 

Max

Administrator
Staff member
К сожалению, проблема не воспроизводится на наших тестовых устройствах в примере media-devices-debug.apk из сборки 1.1.0.58.
Повторно просим указать следующее:
- модель устройства и его прошивку
- версию Андроид
- привести пошагово действия, которые приводят к воспроизведению проблемы в нашем примере (по возможности со скриншотами)
 

Max

Administrator
Staff member
Завели тикет WCS-3645, отпишем здесь по прогрессу.
 
Top