Stream-USB-test icon indicating copy to clipboard operation
Stream-USB-test copied to clipboard

App Crashing

Open mylaimani opened this issue 4 years ago • 1 comments

I followed your code, when I add this line

rtmpUSB.startPreview(mUVCCamera,UVCCamera.DEFAULT_PREVIEW_WIDTH,UVCCamera.DEFAULT_PREVIEW_HEIGHT);

in the connect function it is crashing. Without this line there is no crash, is it possible for you to help

        import android.hardware.usb.UsbDevice;
        import android.os.Bundle;
        import android.util.Log;
        import android.view.View.OnClickListener;
        import android.view.SurfaceHolder;
        import android.view.View;
        import android.widget.Button;
        import android.widget.EditText;
        import android.widget.ImageButton;
        import android.widget.Toast;
        import com.jiangdg.usbcamera.R;
        import com.jiangdg.usbcamera.streamlib.RtmpUSB;
        import com.pedro.rtplibrary.view.OpenGlView;
        import com.serenegiant.usb.CameraDialog;
        import com.serenegiant.usb.IButtonCallback;
        import com.serenegiant.usb.IStatusCallback;
        import com.serenegiant.usb.USBMonitor;
        import com.serenegiant.usb.UVCCamera;
        import com.serenegiant.usb.common.BaseActivity;
        import com.serenegiant.usb.USBMonitor.OnDeviceConnectListener;
        import com.serenegiant.usb.USBMonitor.UsbControlBlock;
        import net.ossrs.rtmp.ConnectCheckerRtmp;
        import java.nio.ByteBuffer;
        
        public class MainActivity extends BaseActivity implements ConnectCheckerRtmp, SurfaceHolder.Callback,
                CameraDialog.CameraDialogParent {
            OpenGlView openGlView;
            private final Object mSync = new Object();
            private USBMonitor mUSBMonitor;
            private UVCCamera mUVCCamera;
            EditText et_url;
            Button start_stop;
            RtmpUSB rtmpUSB;
            private static final boolean DEBUG = true;	// TODO set false when production
            private static final String TAG = "MainActivity";
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                start_stop = findViewById(R.id.start_stop);
                start_stop.setEnabled(false);
                et_url = findViewById(R.id.et_url);
                openGlView = findViewById(R.id.openglview);
                ImageButton mCameraButton = findViewById(R.id.camera_button);
                mCameraButton.setOnClickListener(mOnClickListener);
                rtmpUSB = new RtmpUSB(openGlView,this);
                mUSBMonitor = new USBMonitor(this, mOnDeviceConnectListener);
                start_stop.setOnClickListener(mStreamClickListener);
        
            }
            private final OnClickListener mStreamClickListener = new OnClickListener() {
                @Override
                public void onClick(final View view) {
                    if(mUVCCamera != null){
                        if(!rtmpUSB.isStreaming()){
                            if (rtmpUSB.prepareVideo(1280, 720, 30, 4000 * 1024, false, 0,
                                    mUVCCamera) && rtmpUSB.prepareAudio()) {
                                rtmpUSB.startStream(mUVCCamera, et_url.getText().toString());
                            }
                            start_stop.setText("Stop Stream");
                        } else {
                            rtmpUSB.stopStream(mUVCCamera);
                            start_stop.setText("Start stream");
                        }
                    }
                }
        
            };
            private final OnClickListener mOnClickListener = new OnClickListener() {
                @Override
                public void onClick(final View view) {
                    synchronized (mSync) {
                        if (mUVCCamera == null) {
                            CameraDialog.showDialog(MainActivity.this);
                        } else {
                            releaseCamera();
                        }
                    }
                }
            };
            @Override
            protected void onStart() {
                super.onStart();
                mUSBMonitor.register();
                synchronized (mSync) {
                    if (mUVCCamera != null) {
                        mUVCCamera.startPreview();
                    }
                }
            }
        
            @Override
            protected void onStop() {
                synchronized (mSync) {
                    if (mUVCCamera != null) {
                        mUVCCamera.stopPreview();
                    }
                    if (mUSBMonitor != null) {
                        mUSBMonitor.unregister();
                    }
                }
                super.onStop();
            }
        
            @Override
            protected void onDestroy() {
                synchronized (mSync) {
                    releaseCamera();
                    if (mToast != null) {
                        mToast.cancel();
                        mToast = null;
                    }
                    if (mUSBMonitor != null) {
                        mUSBMonitor.destroy();
                        mUSBMonitor = null;
                    }
                }
                super.onDestroy();
            }
        
            private Toast mToast;
        
            private final OnDeviceConnectListener mOnDeviceConnectListener = new OnDeviceConnectListener() {
        
                @Override
                public void onAttach(UsbDevice device) {
                    if (DEBUG) Log.v(TAG, "onAttach:" + device);
                    mUSBMonitor.requestPermission(device);
                }
        
                @Override
                public void onDettach(UsbDevice device) {
                    Toast.makeText(MainActivity.this, "USB_DEVICE_DETACHED", Toast.LENGTH_SHORT).show();
                }
        
                @Override
                public void onConnect(final UsbDevice device, final UsbControlBlock ctrlBlock, final boolean createNew) {
                    releaseCamera();
                    Toast.makeText(MainActivity.this, "Connection USB Step 1", Toast.LENGTH_SHORT).show();
                    queueEvent(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "Connection USB Step 2", Toast.LENGTH_SHORT).show();
                            final UVCCamera camera = new UVCCamera();
                            camera.open(ctrlBlock);
                            Toast.makeText(MainActivity.this, "Connection USB Step 3", Toast.LENGTH_SHORT).show();
                            camera.setStatusCallback(new IStatusCallback() {
                                @Override
                                public void onStatus(final int statusClass, final int event, final int selector,
                                                     final int statusAttribute, final ByteBuffer data) {
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            final Toast toast = Toast.makeText(MainActivity.this, "onStatus(statusClass=" + statusClass
                                                    + "; " +
                                                    "event=" + event + "; " +
                                                    "selector=" + selector + "; " +
                                                    "statusAttribute=" + statusAttribute + "; " +
                                                    "data=...)", Toast.LENGTH_SHORT);
                                            synchronized (mSync) {
                                                if (mToast != null) {
                                                    mToast.cancel();
                                                }
                                                toast.show();
                                                mToast = toast;
                                            }
                                        }
                                    });
                                }
                            });
                            camera.setButtonCallback(new IButtonCallback() {
                                @Override
                                public void onButton(final int button, final int state) {
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            final Toast toast = Toast.makeText(MainActivity.this, "onButton(button=" + button + "; " +
                                                    "state=" + state + ")", Toast.LENGTH_SHORT);
                                            synchronized (mSync) {
                                                if (mToast != null) {
                                                    mToast.cancel();
                                                }
                                                mToast = toast;
                                                toast.show();
                                            }
                                        }
                                    });
                                }
                            });
        //					camera.setPreviewTexture(camera.getSurfaceTexture());
                            Toast.makeText(MainActivity.this, "Connection USB Step 4", Toast.LENGTH_SHORT).show();
                            try {
                                camera.setPreviewSize(UVCCamera.DEFAULT_PREVIEW_WIDTH, UVCCamera.DEFAULT_PREVIEW_HEIGHT, UVCCamera.FRAME_FORMAT_MJPEG);
                            } catch (final IllegalArgumentException e) {
                                try {
                                    camera.setPreviewSize(UVCCamera.DEFAULT_PREVIEW_WIDTH, UVCCamera.DEFAULT_PREVIEW_HEIGHT, UVCCamera.DEFAULT_PREVIEW_MODE);
                                } catch (final IllegalArgumentException e1) {
                                    camera.destroy();
                                    return;
                                }
                            }
                            //final SurfaceTexture st = openGlView.getSurfaceTexture();
                           // if (st != null) {
                                //mPreviewSurface = new Surface(st);
                                //camera.setPreviewDisplay(mPreviewSurface);
        //						camera.setFrameCallback(mIFrameCallback, UVCCamera.PIXEL_FORMAT_RGB565/*UVCCamera.PIXEL_FORMAT_NV21*/);
                                //camera.startPreview();
                            //}
                            synchronized (mSync) {
                                Toast.makeText(MainActivity.this, "Connection USB Step 5", Toast.LENGTH_SHORT).show();
                                mUVCCamera = camera;
                              _**//When I add this rtmpUSB.startPreview the application is crashing, without this line there is no crash I feel it has to do something with either mUVCCamera or with openGlView**_ **rtmpUSB.startPreview(mUVCCamera,UVCCamera.DEFAULT_PREVIEW_WIDTH,UVCCamera.DEFAULT_PREVIEW_HEIGHT);**
                            }
                        }
                    }, 0);
                }
        
        
                @Override
                public void onDisconnect(UsbDevice device, UsbControlBlock ctrlBlock) {
                    releaseCamera();
                }
        
                @Override
                public void onCancel(UsbDevice device) {
        
                }
            };
        
            private synchronized void releaseCamera() {
                synchronized (mSync) {
                    if (mUVCCamera != null) {
                        try {
                            mUVCCamera.setStatusCallback(null);
                            mUVCCamera.setButtonCallback(null);
                            mUVCCamera.close();
                            mUVCCamera.destroy();
                        } catch (final Exception e) {
                            //
                        }
                        mUVCCamera = null;
                    }
                }
            }
        
        
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
        
            }
        
            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
        
            }
        
            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        
            }
        
            @Override
            public void onConnectionSuccessRtmp() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "Connection success", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        
            @Override
            public void onConnectionFailedRtmp(String reason) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "Connection failed. " + reason, Toast.LENGTH_SHORT)
                                .show();
                        rtmpUSB.stopStream(mUVCCamera);
                        ///But
                    }
                });
            }
        
            @Override
            public void onDisconnectRtmp() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "Disconnected", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        
            @Override
            public void onAuthErrorRtmp() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "Auth error", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        
            @Override
            public void onAuthSuccessRtmp() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "Auth success", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        
            @Override
            public USBMonitor getUSBMonitor() {
                return mUSBMonitor;
            }
        
            @Override
            public void onDialogResult(boolean canceled) {
        
            }
        }

mylaimani avatar Mar 11 '21 08:03 mylaimani

Sorry, this project is abandoned because I have no way to test it (I don't have UVC camera anymore). I can't help you with this.

pedroSG94 avatar Mar 11 '21 11:03 pedroSG94