diff --git a/app/build.gradle b/app/build.gradle index 2fcb6542..c2544c96 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -136,9 +136,10 @@ dependencies { // implementation project(path: ':opencv') implementation files('libs/devapi.aar') // debugImplementation files('libs/rtmp-client-debug.aar') - // releaseImplementation files('libs/rtmp-client.aar') + implementation files('libs/android-openGL-canvas-1.5.4.0.aar') + implementation files('libs/rtmp-client.aar') api project(':gpuv') - api project(':stream') + implementation project(':stream') implementation 'dev.mobile:dadb:1.2.7' diff --git a/app/libs/android-openGL-canvas-1.5.4.0.aar b/app/libs/android-openGL-canvas-1.5.4.0.aar new file mode 100644 index 00000000..ee4506b7 Binary files /dev/null and b/app/libs/android-openGL-canvas-1.5.4.0.aar differ diff --git a/app/libs/rtmp-client.aar b/app/libs/rtmp-client.aar new file mode 100644 index 00000000..74992ed8 Binary files /dev/null and b/app/libs/rtmp-client.aar differ diff --git a/app/src/main/cpp/GPIOControl.h b/app/src/main/cpp/GPIOControl.h index dad4dce4..ba976153 100644 --- a/app/src/main/cpp/GPIOControl.h +++ b/app/src/main/cpp/GPIOControl.h @@ -41,19 +41,32 @@ #ifdef USING_N938 -#define CMD_SET_WTH_POWER 490 -#define CMD_SET_PULL_POWER 491 -#define CMD_SET_ANGLE_POWER 492 -#define CMD_SET_OTHER_POWER 493 -#define CMD_SET_PIC1_POWER 494 -#define CMD_SET_485_en0 301 -#define CMD_SET_485_en1 302 -#define CMD_SET_485_en2 303 -#define CMD_SET_485_en3 304 -#define CMD_SET_485_en4 305 - - - +#define CMD_SET_485_EN_STATE 131 +#define CMD_SET_CAM_3V3_EN_STATE 132 +#define CMD_SET_12V_EN_STATE 133 +#define CMD_SET_485_STATE 121 +#define CMD_SET_SPI_MODE 123 +#define CMD_SET_SPI_BITS_PER_WORD 124 +#define CMD_SET_SPI_MAXSPEEDHZ 125 +#define CMD_SET_SPI_POWER 129 +#define CMD_SET_WTH_POWER 490 +#define CMD_SET_PULL_POWER 491 +#define CMD_SET_ANGLE_POWER 492 +#define CMD_SET_OTHER_POWER 493 +#define CMD_SET_PIC1_POWER 494 +#define CMD_SET_GPIO157_POWER 510 +#define CMD_SET_GPIO5_POWER 511 +#define CMD_SET_PWM_BEE_STATE 126 +#define CMD_SET_ALM_MODE 128 +#define CMD_SET_485_en0 301 +#define CMD_SET_485_en1 302 +#define CMD_SET_485_en2 303 +#define CMD_SET_485_en3 304 +#define CMD_SET_485_en4 305 +#define CMD_SET_OTG_STATE 107 +#define CMD_GET_OTG_STATE 108 + +#if 0 #define CMD_485_0_DE 156 // 485_0 DE信号 #define CMD_485_0_PWR_EN 157 // 485_0 电源使能 @@ -94,6 +107,7 @@ #define CMD_SPI_PWR_EN 43 // SPI转串口电源使能 +#endif #endif // USING_N938 diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 96809190..0dd13859 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -965,7 +965,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader) } #endif - if (m_imagesCaptured == ~0 || m_imagesCaptured != 0) + if (m_imagesCaptured == ~0 || m_imagesCaptured != EXPECTED_CAPTURE_IDX) { // XYLOG(XYLOG_SEVERITY_DEBUG, "m_imagesCaptured=%u wait for next image", m_imagesCaptured); // Not Ready Or Taken @@ -1508,7 +1508,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque status = ACameraMetadata_getConstEntry(result, ACAMERA_CONTROL_AE_EXPOSURE_COMPENSATION, &val); mResult.compensation = (status == ACAMERA_OK) ? *(val.data.i32) : 0; - if (m_imagesCaptured == 0) + if (m_imagesCaptured == EXPECTED_CAPTURE_IDX) { mFinalResult = mResult; } diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 733f577b..f3367552 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -38,6 +38,9 @@ static const uint64_t kMaxExposureTime = static_cast(250000000); #define WAIT_AWB_LOCKED 2 #define WAIT_AF_LOCKED 4 +#define EXPECTED_CAPTURE_IDX 0 +#define EXPECTED_CAPTURE_IDX 1 + class CameraManager { public: diff --git a/app/src/main/java/com/xypower/mpapp/StreamActivity.java b/app/src/main/java/com/xypower/mpapp/StreamActivity.java index 2ddf4e3d..d84ccb2a 100644 --- a/app/src/main/java/com/xypower/mpapp/StreamActivity.java +++ b/app/src/main/java/com/xypower/mpapp/StreamActivity.java @@ -1,49 +1,180 @@ package com.xypower.mpapp; +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; +import android.graphics.SurfaceTexture; +import android.hardware.Camera; import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Message; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; +/* +import com.chillingvan.canvasgl.ICanvasGL; +import com.chillingvan.canvasgl.glcanvas.BasicTexture; +import com.chillingvan.canvasgl.glview.texture.GLTexture; +import com.chillingvan.canvasgl.textureFilter.BasicTextureFilter; +import com.chillingvan.canvasgl.textureFilter.HueFilter; +import com.chillingvan.canvasgl.textureFilter.TextureFilter; import io.antmedia.rtmp_client.RTMPMuxer; +import com.xypower.stream.camera.InstantVideoCamera; +import com.xypower.stream.encoder.video.H264Encoder; +import com.xypower.stream.muxer.RTMPStreamMuxer; +import com.xypower.stream.publisher.CameraStreamPublisher; +import com.xypower.stream.publisher.StreamPublisher; +*/ + +import java.io.IOException; +import java.util.List; + + public class StreamActivity extends AppCompatActivity { - private RTMPMuxer mRtmpMuxer; - private String mUrl; + /* + private CameraStreamPublisher streamPublisher; + private com.chillingvan.instantvideo.sample.test.camera.CameraPreviewTextureView cameraPreviewTextureView; + private InstantVideoCamera instantVideoCamera; + private Handler handler; + private EditText addrEditText; + private HandlerThread handlerThread; + private TextureFilter textureFilterLT; + private TextureFilter textureFilterRT; + private com.chillingvan.instantvideo.sample.test.VideoFrameHandlerHelper videoFrameHandlerHelper; +*/ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + initFrameHandlerHelper(); setContentView(R.layout.activity_stream); +/* + cameraPreviewTextureView = findViewById(R.id.camera_produce_view); + cameraPreviewTextureView.setOnDrawListener(new H264Encoder.OnDrawListener() { + @Override + public void onGLDraw(ICanvasGL canvasGL, List producedTextures, List consumedTextures) { + + GLTexture texture = producedTextures.get(0); + drawVideoFrame(canvasGL, texture.getSurfaceTexture(), texture.getRawTexture()); + } + + }); + addrEditText = (EditText) findViewById(R.id.ip_input_test); + + + instantVideoCamera = new InstantVideoCamera(Camera.CameraInfo.CAMERA_FACING_FRONT, 640, 480); +// instantVideoCamera = new InstantVideoCamera(Camera.CameraInfo.CAMERA_FACING_FRONT, 1280, 720); + + handlerThread = new HandlerThread("StreamPublisherOpen"); + handlerThread.start(); + handler = new Handler(handlerThread.getLooper()) { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); +// StreamPublisher.StreamPublisherParam streamPublisherParam = new StreamPublisher.StreamPublisherParam(); +// StreamPublisher.StreamPublisherParam streamPublisherParam = new StreamPublisher.StreamPublisherParam(1080, 640, 9500 * 1000, 30, 1, 44100, 19200); + StreamPublisher.StreamPublisherParam streamPublisherParam = new StreamPublisher.StreamPublisherParam.Builder().setWidth(540).setHeight(750).setVideoBitRate(1500 * 1000).setFrameRate(30).setIframeInterval(1).setSamplingRate(44100).setAudioBitRate(32000).createStreamPublisherParam(); + streamPublisherParam.outputFilePath = getExternalFilesDir(null) + "/test_flv_encode.flv"; +// streamPublisherParam.outputFilePath = getExternalFilesDir(null) + "/test_mp4_encode.mp4"; + streamPublisher.prepareEncoder(streamPublisherParam, new H264Encoder.OnDrawListener() { + + @Override + public void onGLDraw(ICanvasGL canvasGL, List producedTextures, List consumedTextures) { + GLTexture texture = consumedTextures.get(0); + drawVideoFrame(canvasGL, texture.getSurfaceTexture(), texture.getRawTexture()); + } + }); + try { + streamPublisherParam.outputUrl = addrEditText.getText().toString(); + streamPublisher.startPublish(); + } catch (IOException e) { + e.printStackTrace(); + runOnUiThread(new Runnable() { + @Override + public void run() { + ((TextView)findViewById(R.id.test_camera_button)).setText("START"); + } + }); + } + } + }; + + streamPublisher = new CameraStreamPublisher(new RTMPStreamMuxer(), cameraPreviewTextureView, instantVideoCamera); +// streamPublisher = new CameraStreamPublisher(new MP4Muxer(), cameraPreviewTextureView, instantVideoCamera); + */ + } + - Intent intent = getIntent(); - if (intent != null) { - mUrl = intent.getStringExtra("url"); + private void initFrameHandlerHelper() { + /* + videoFrameHandlerHelper = new com.chillingvan.instantvideo.sample.test.VideoFrameHandlerHelper(getApplicationContext()); + */ + } + + /* + private void drawVideoFrame(ICanvasGL canvasGL, @Nullable SurfaceTexture outsideSurfaceTexture, @Nullable BasicTexture outsideTexture) { + // Here you can do video process + // 此处可以视频处理,例如加水印等等 + + if(textureFilterLT == null) { + textureFilterLT = new BasicTextureFilter(); + } + if(textureFilterRT == null) { + textureFilterRT = new HueFilter(180); } + int width = outsideTexture.getWidth(); + int height = outsideTexture.getHeight(); + canvasGL.drawSurfaceTexture(outsideTexture, outsideSurfaceTexture, 0, 0, width /2, height /2, textureFilterLT); + canvasGL.drawSurfaceTexture(outsideTexture, outsideSurfaceTexture, 0, height/2, width/2, height, textureFilterRT); + videoFrameHandlerHelper.initDrawHelper(width/2, height/2); + videoFrameHandlerHelper.drawText(canvasGL); - openRtmpMuxer(mUrl); } - protected void openRtmpMuxer(String url) { - if (mRtmpMuxer != null) { - if (mRtmpMuxer.isConnected()) { - mRtmpMuxer.close(); - } - } else { - mRtmpMuxer = new RTMPMuxer(); + */ + + @Override + protected void onResume() { + super.onResume(); + // streamPublisher.resumeCamera(); + } + + @Override + protected void onPause() { + super.onPause(); + /* + streamPublisher.pauseCamera(); + if (streamPublisher.isStart()) { + streamPublisher.closeAll(); } + ((TextView)findViewById(R.id.test_camera_button)).setText("START"); - int result = mRtmpMuxer.open(url,0, 0); + */ } @Override protected void onDestroy() { super.onDestroy(); + //handlerThread.quitSafely(); + } - if (mRtmpMuxer != null) { - mRtmpMuxer.close(); - mRtmpMuxer = null; + public void clickStartTest(View view) { + TextView textView = (TextView) view; + /* + if (streamPublisher.isStart()) { + streamPublisher.closeAll(); + textView.setText("START"); + } else { + streamPublisher.resumeCamera(); + handler.sendEmptyMessage(1); + textView.setText("STOP"); } + + */ } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_stream.xml b/app/src/main/res/layout/activity_stream.xml index d0d7643a..2ab77746 100644 --- a/app/src/main/res/layout/activity_stream.xml +++ b/app/src/main/res/layout/activity_stream.xml @@ -6,4 +6,51 @@ android:layout_height="match_parent" tools:context=".StreamActivity"> +