Stream-USB-test
Stream-USB-test copied to clipboard
App Crashing
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) {
}
}
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.