#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