0

작업하고있는 응용 프로그램에 대한 도움이 필요합니다. 응용 프로그램에는 오디오가 포함 된 비디오를 녹화하기위한 사용자 정의 카메라 인터페이스가 있어야하며 실시간으로 TextureView 캔버스에 일부 객체를 추가해야합니다. Old Camera API는 더 이상 사용되지 않으므로 Camera2 API를 사용하여 TextureView에서 실시간 미리보기를 렌더링해야합니다. 내 목표는 TextureView 캔버스 위에 몇 가지 개체를 그리는 것입니다. 일부 텍스트/jpg/gif 일 수 있지만 카메라 스트림은 백그라운드에서 렌더링되고 오버레이 캔버스 콘텐츠 및 카메라 피드로 비디오를 녹화 할 수 있습니다.TextureView에서 개체를 그리는 방법 카메라 스트림을 미리보고 개체와 함께 스트림을 기록 하시겠습니까?

투명 오버레이보기에서 사용자 지정 콘텐츠를 그릴 수는 있지만 사용자의보기 용도에 불과합니다. 나는 이것을 며칠 동안 연구하려고 노력했지만, 나는 나의 목적을 해결하는 올바른 접근법을 얻을 수 없다.

은 내가 openCamera() 메소드를 호출 한 후 다음 코드를 시도,하지만 난 그냥 사각형을 그려 볼 수 있지만 카메라 미리보기 :

Canvas canvas = mTextureView.lockCanvas(); 
Paint myPaint = new Paint(); 
myPaint.setColor(Color.WHITE); 
myPaint.setStrokeWidth(10); 
canvas.drawRect(100, 100, 300, 300, myPaint); 
mTextureView.unlockCanvasAndPost(canvas); 

는 또한 사용자 정의 TextureView 클래스를 시도하고 (캔버스를 thevonDrawForeground를 오버라이드 (override) 캔버스) 메서드를 사용하지만 작동하지 않습니다.

TextureView 클래스의 onDraw() 메서드가 final이므로 카메라 피드를 스트리밍하는 것 외에는 아무 것도 할 수 없습니다.

/** 
* Subclasses of TextureView cannot do their own rendering 
* with the {@link Canvas} object. 
* 
* @param canvas The Canvas to which the View is rendered. 
*/ 
@Override 
protected final void onDraw(Canvas canvas) { 
} 

간단히 말해서, 사용자가 카메라 소포를 통해 비디오를 녹화 할 수 있기를 바랍니다.

답변

0

비디오를 실시간으로 수정하는 것은 높은 프로세서이므로 높은 배터리 오버 헤드 작업입니다.하지만 서버 측에서 수정 사항을 추가 할 수 있다면 스트림을 함께 보내면됩니다. 서버에 타임 스탬프가 적용된 텍스트 오버레이 집합을 사용하면 더 많은 마력 서버가 있어야합니다.

다음 코드는 안드로이드에서 Camera2가 캡처 한 스틸 사진이나 프레임에 텍스트와 이미지를 추가합니다. 저는 동영상에이 동영상을 사용하지 않았기 때문에 속도에 대해 논평 할 수 없으며 실시간 동영상 스트림으로이를 수행하는 것이 현실적인지 여부도 알 수 있습니다.이 동영상은 최적화되지 않았지만 시작점이되어야합니다.

 //Copy the image to a BitBuffer 
     ByteBuffer buffer = mCameraImage.getPlanes()[0].getBuffer(); 
     byte[] bytes = new byte[buffer.remaining()]; 
     Log.d(TAG,"ImageSaver bytes.length: " + bytes.length); 
     buffer.get(bytes); 
     BitmapFactory.Options opt = new BitmapFactory.Options(); 
     opt.inMutable = true; 
     Bitmap cameraBitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length, opt); 
     if (cameraBitmap == null) { 
      Log.d(TAG,"ImageSaver cameraBitmap is null"); 
      return; 
     } else { 
      camImgBitmap = cameraBitmap; 
     } 

     //Modify captured picture by drawing on canvas 
     Canvas camImgCanvas = new Canvas(camImgBitmap); 

     //Draw an image in the middle 
     Drawable d = ContextCompat.getDrawable(this, R.drawable.image_to_add); 
     int bitMapWidthCenter = camImgBitmap.getWidth()/2; 
     int bitMapheightCenter = camImgBitmap.getHeight()/2; 
     int imageToDrawSize = camImgBitmap.getWidth()/10; 
     int rTop = bitMapheightCenter - sightsSize; 
     int rLeft = bitMapWidthCenter - sightsSize; 
     int rRight = bitMapWidthCenter + sightsSize; 
     int rBot = bitMapheightCenter + sightsSize; 
     d.setBounds(rLeft, rTop, rRight, rBot); 
     d.draw(camImgCanvas); 

     //Now Draw in some text 
     Paint paint = new Paint(); 
     paint.setColor(Color.GREEN); 
     int textSize = camImgBitmap.getHeight()/20; 
     int textPadding = 40; 
     paint.setTextSize(textSize); 
     camImgCanvas.drawText("Name: " + text1, textPadding, (camImgBitmap.getHeight() - (textSize * 2)) - textPadding, paint); 
     camImgCanvas.drawText("Time: " + text2 + " degrees", textPadding, (camImgBitmap.getHeight() - textSize) - textPadding, paint); 
0

가장 효과적인 옵션은 카메라 피드를 GPU에 직접 연결하고 그 위에 그려 넣은 다음 디스플레이 및 비디오 엔코더에 직접 렌더링하는 것입니다.

이것은 많은 비디오 채팅 앱이하는 것입니다 (예 : 모든 효과).

SurfaceTexture를 사용하여 camera2를 EGL에 연결 한 다음 미리보기를 쿼드에 렌더링 한 다음 위에 추가 할 수 있습니다.

그런 다음 화면 버퍼 (예 : GLSurfaceView)와 MediaRecorder/MediaCodec Surface에서 별도의 EGLImage로 렌더링 할 수 있습니다.

거기에는 많은 코드가 포함되어 있으며 EGL 설정을위한 많은 스 캐 폴딩이 있으므로 간단한 예제를 가리키는 것이 어렵습니다.