程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了DJI 移动 SDK Mavic 2 Pro - 直播 4k大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决DJI 移动 SDK Mavic 2 Pro - 直播 4k?

开发过程中遇到DJI 移动 SDK Mavic 2 Pro - 直播 4k的问题如何解决?下面主要结合日常开发的经验,给出你关于DJI 移动 SDK Mavic 2 Pro - 直播 4k的解决方法建议,希望对你解决DJI 移动 SDK Mavic 2 Pro - 直播 4k有所启发或帮助;

我是 stackoverflow 的新手,希望你们中有人能帮助我。

我使用 DJI 移动 SDK 开发了一个应用程序,并实现了直播。问题是直播的分辨率不是 4k,我需要 4k。我认为无人机为实时预览提供了辅助流。是否可以将次要流更改为具有 4k 分辨率的主要流?如果有可能,我该怎么做?或者是否可以简单地提高直播流/次流的分辨率?

这是我目前的实现:

用于实时流预览的表面纹理元素的初始化:

SurfaCETextureListener surfaCETextureListener = new SurfaCETextureListener(getApplicationContext());
this.vIDeoStreamPrevIEwTtVIEw.setSurfaCETextureListener(surfaCETextureListener);

这是我的听众:

public class SurfaCETextureListener implements TextureVIEw.SurfaCETextureListener {

    private final Context context;

    public SurfaCETextureListener(Context context) {
        this.context = context;
    }

    @OverrIDe
    public voID onSurfaCETextureAvailable(SurfaCETexture surface,int wIDth,int height) {
        if (DroneControl.getCodecManager() == null) {
            DroneControl.setCodecManager(new DJICodecManager(this.context,surface,wIDth,height));
            DroneControl.getCodecManager().resetKeyFrame();
            DroneControl.getCodecManager().enabledYuvData(true);
            DroneControl.getCodecManager().setYuvDataCallBACk(new liveStreamDataCallBACk(this.context));
        }
    }

    @OverrIDe
        public voID onSurfaCETextureSizeChanged(SurfaCETexture surface,int height) {
    }

    @OverrIDe
    public Boolean onSurfaCETextureDestroyed(SurfaCETexture surfacE) {
        if (DroneControl.getCodecManager() != null) {
            DroneControl.getCodecManager().cleanSurface();
            DroneControl.setCodecManager(null);
        }
        return false;
    }

    @OverrIDe
    public voID onSurfaCETextureupdated(SurfaCETexture surfacE) {
    }
}

这是我的回调函数:

public class liveStreamDataCallBACk implements Base,DJICodecManager.YuvDataCallBACk {

    private final Context context;
    private final long lastupdate;

    public liveStreamDataCallBACk(Context context) {
        this.context = context;
        this.lastupdate = System.currentTimeMillis();
    }

    @OverrIDe
    public voID onYuvDataReceived(MediaFormat format,final ByteBuffer yuvFrame,int dataSize,final int wIDth,final int height) {
        long differenceInMillis = System.currentTimeMillis() - this.lastupdate;

        if (differenceInMillis > SCREEN_SHOT_PERIOD && yuvFrame != null) {
            final byte[] bytes = new byte[dataSize];
            yuvFrame.get(bytes);
            newSaveYuvDataToJPEG(bytes,height);
        }
    }

    private voID newSaveYuvDataToJPEG(byte[] yuvFrame,int height) {
        if (yuvFrame.length < wIDth * height) {
            return;
        }
        int length = wIDth * height;

        byte[] u = new byte[wIDth * height / 4];
        byte[] v = new byte[wIDth * height / 4];

        for (int i = 0; i < u.length; i++) {
            u[i] = yuvFrame[length + i];
            v[i] = yuvFrame[length + u.length + i];
        }
        for (int i = 0; i < u.length; i++) {
            yuvFrame[length + 2 * i] = v[i];
            yuvFrame[length + 2 * i + 1] = u[i];
        }
        screenShot(yuvFrame,height);
    }

    private voID screenShot(byte[] buf,int height) {
        ByteArrayOutputStream bOutput = new ByteArrayOutputStream();

        YuvImage yuvImage = new YuvImage(buf,ImageFormat.nv21,height,null);

        yuvImage.compresstoJpeg(new Rect(0,height),100,bOutput);

        inserTintoDB(Base64.getEncoder().encodetoString(bOutput.toByteArray()));
    }

    private voID inserTintoDB(String base64EncodedContent) {
        //only a limit of images will be saved insIDe the DB to avoID using too much space!
        DatabaseUtil.reduCETableContentToMaxContentIfNecessary(this.context,ScreenShotModel.ScreenShotEntry.table_name,MAX_KEEP_COUNT_FOR_liVE_STREAM_SCREEN_SHOTS);

        Date Now = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_FOR_LOGGING,Locale.GERMANY);
        sqliteDatabase db = DroneControl.getDbWriteAccess(this.context);

        //create a new map of values,where column names are the keys
        ContentValues values = new ContentValues();
        values.put(ScreenShotModel.ScreenShotEntry.columN_name_DATA,base64EncodedContent);
        values.put(ScreenShotModel.ScreenShotEntry.columN_name_CREATED,dateFormat.format(Now));

        db.insert(ScreenShotModel.ScreenShotEntry.table_name,null,values);
    }
}

希望有人能解决我的问题。

非常感谢!

最好的问候

解决方法

做不到。 1080p 是最大的,ocusync 不能做任何更高的。带宽不够高,无人机硬件不支持。

反正我不知道该怎么做。 你唯一能做的就是拍摄一张静止图像并下载它,当然它会很慢,但可以用于图像识别。你没有说你打算用它做什么,但因为你似乎在看框架,这可能是一个(缓慢的)解决方案。

来自 DJI 网站: 同步 作为 Lightbridge 家族的一员,DJI 新开发的 OcuSync 传输系统在所有传输速度下的性能都远优于 Wi-Fi 传输。 OcuSync 还采用了更有效的数字压缩和通道传输技术,使其即使在无线电干扰强烈的环境中也能可靠地传输高清视频。与传统的模拟传输相比,OcuSync 可以以 720p 和 1080p 传输视频 - 相当于提高 4-10 倍的质量,没有色偏、静态干扰、闪烁或与模拟传输相关的其他问题。即使使用相同数量的无线电传输功率,OcuSync 在 4.1 英里(7 公里)处也比模拟传输更远

,

非常感谢您的回答和帮助!

实际上,我尝试先捕获 4k 图像并传输它。正如您已经说过的,我尝试使用帧进行对象检测,并且我需要获得最佳性能。捕获图像并传输图像非常耗时。我需要大约 1.5 秒的时间来捕获和保存图像,再需要 3 秒的时间来传输它,对我来说最大的惊喜是读取 SD 卡以找到最新的图像需要将近 11 秒(我尝试了最大级别为 10 的不同 SD 卡) )。总之,一张图片的整个过程需要 15.5 秒,这对我来说太长了......

然后我想我可以通过直播来做到这一点。直播的整个过程需要 500 毫秒,这对我的项目来说是可以接受的值。很发人深省,似乎不可能……

也许还有另一个机会可以非常快地从无人机传输图像?

,

我从直播中获得剧照,但以另一种方式。 我使用 fpv-widget(实时流显示在设备上),并直接从小部件读取 bmp。 这样你就不用在java中处理这么多数据了。

我什至是从 python 中完成的,并且由于一些怪癖,我在没有任何编组的情况下将它放入了 opencv2。可以在 python 中读出 100 帧/秒,所以 java 至少应该那么快。 你可能会重新你的做法。尽量避免重新打包图像数据。 它仍然只有1080,但我必须说它的质量非常好。

<dji.ux.widget.FPVWidget
    android:id="@+id/fpv_widget"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    custom:sourceCameraNameVisibility="true" />

    public Bitmap getFrameBitmap() {
        fpvWidget = findViewById(R.id.fpv_widget);
        return fpvWidget.getBitmap();
    }

大佬总结

以上是大佬教程为你收集整理的DJI 移动 SDK Mavic 2 Pro - 直播 4k全部内容,希望文章能够帮你解决DJI 移动 SDK Mavic 2 Pro - 直播 4k所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。