Как записать предварительный просмотр SurfaceView

#android #surfaceview #video-recording

#Android #поверхностный просмотр #видеозапись #просмотр surfaceview #запись видео

Вопрос:

Я работаю над приложением, в котором я использую Surface View только для предварительного просмотра кадров. Кто-нибудь может сказать мне, как я могу записывать видео этого предварительного просмотра SurfaceView?

Комментарии:

1. Используйте API-интерфейсы медиапроекции для записи всего экрана.

2. Я не хочу записывать весь экран, я просто хочу записать предварительный просмотр SurfaceView.

3. AFAIK, у вас нет особого выбора.

Ответ №1:

У вас есть 3 возможности :

1 — Захватите каждый свой кадр SurfaceView и сохраните все захваченные растровые изображения в массив, после чего вы можете закодировать его в видеофайл с помощью MediaRecord

Вот полный пример того, как это работает: ViewRecorder

2 — Использование EZFilter (я уже тестировал), это немного долго, но стоит попробовать :

XML :

 <RelativeLayout
            android:id="@ id/frm"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:animateLayoutChanges="true"
            android:gravity="center_vertical|center_horizontal">


            <cn.ezandroid.ezfilter.core.environment.TextureFitView
                android:id="@ id/render_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:layout_gravity="center"
                android:visibility="gone" />

            <cn.ezandroid.ezfilter.view.glview.GLLinearLayout
                android:id="@ id/gl_layout"
                android:layout_width="wrap_content"
                android:gravity="center"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:background="@android:color/transparent"
                android:visibility="invisible">

                <!--PUT YOUR SURFACEVIEW XML HERE-->
    
            </cn.ezandroid.ezfilter.view.glview.GLLinearLayout>
        </RelativeLayout>
  

JAVA :

 GLLinearLayout mLinearLayout = findViewById(R.id.gl_layout);
ISupportRecord mSupportRecord;
TextureFitView renderView;
RenderPipeline mRenderPipeline = new RenderPipeline();

mRenderPipeline.setRenderSize((int) surfaceWidth, (int) surfaceHeight);
                mRenderPipeline = EZFilter.input(mLinearLayout)
                        .addFilter(null)
                        .enableRecord(videoPath, true, false)
                        .into(renderView);
                for (GLRender render : mRenderPipeline.getEndPointRenders()) {
                    if (render instanceof ISupportRecord) {
                        mSupportRecord = (ISupportRecord) render;
                    }
                }
                mSupportRecord.setRecordSize(surfaceWidth, surfaceHeight);
  

Когда вы хотите начать запись :

  private void startRecording() {
        this.mSupportRecord.startRecording();
        this.mSupportRecord.enableRecordAudio(false);
 }
  

Чтобы остановить запись :

   private void stopRecording(){
       if (mSupportRecord != null) 
            mSupportRecord.stopRecording();
  }
  

3 — Вы можете захватить весь экран и обрезать записанное видео с помощью FFmpeg