Android开发:如何用TextureView创建显示DJI SDK直播流的弹窗?
在弹窗中嵌入TextureView播放DJI视频流的实现方案
当然可以实现,下面是具体的实现步骤和注意要点:
1. 编写弹窗布局文件
创建包含TextureView的弹窗布局(例如res/layout/dialog_dji_video.xml),按需添加其他控件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:orientation="vertical"> <TextureView android:id="@+id/tv_dji_video" android:layout_width="match_parent" android:layout_height="300dp" android:background="#000000" /> <Button android:id="@+id/btn_close" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="关闭弹窗" android:layout_gravity="end" android:layout_marginTop="12dp" /> </LinearLayout>
2. 在代码中实现弹窗与DJI视频流的绑定
在Activity/Fragment中创建弹窗,初始化TextureView并对接DJI SDK的视频推送逻辑:
// 初始化弹窗 Dialog videoDialog = new Dialog(this, R.style.Theme_AppCompat_Dialog); videoDialog.setContentView(R.layout.dialog_dji_video); videoDialog.setCanceledOnTouchOutside(true); // 获取TextureView实例 TextureView djiTexture = videoDialog.findViewById(R.id.tv_dji_video); // 监听SurfaceTexture状态,确保在可用时绑定视频流 djiTexture.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { // 绑定DJI视频流到当前SurfaceTexture // 根据DJI SDK版本选择对应API,例如: VideoFeeder.getInstance().getPrimaryVideoFeed().setSurfaceTexture(surface); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { // 可选:处理纹理尺寸变化,调整视频显示比例 } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { // 解绑视频流,释放资源 VideoFeeder.getInstance().getPrimaryVideoFeed().setSurfaceTexture(null); return true; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { // 可选:帧更新回调,无需额外操作 } }); // 关闭按钮逻辑 videoDialog.findViewById(R.id.btn_close).setOnClickListener(v -> { // 提前解绑视频流 VideoFeeder.getInstance().getPrimaryVideoFeed().setSurfaceTexture(null); videoDialog.dismiss(); }); // 显示弹窗 videoDialog.show();
3. 关键注意事项
- SDK初始化检查:确保DJI Mobile SDK已经完成初始化,飞行器/云台的视频流处于推送状态,否则TextureView会显示空白。
- 资源释放:弹窗关闭时必须解绑TextureView与视频流的绑定,避免内存泄漏或SDK内部报错。
- 显示比例调整:如果出现视频拉伸变形,可以在
onSurfaceTextureAvailable中通过调整SurfaceTexture的矩阵来修正显示比例,或者设置TextureView的scaleType。 - 权限验证:确保已申请
CAMERA、ACCESS_FINE_LOCATION等DJI SDK所需的权限,否则视频流可能无法正常推送。
内容的提问来源于stack exchange,提问作者Dylan
相关产品推荐
相关产品推荐

